Mit SCardGetStatusChange werden benachrichtigt Karte einzusetzen/zu entfernen, ohne polling

Ich versuche zu erkennen, wenn eine Karte eingefügt wurde, die in einem reader.
Wenn ich eine böse polling-Schleife wie diese:

      public struct SCARD_READERSTATE
        {
            [MarshalAs(UnmanagedType.LPWStr)]
            public string szReader;
            public byte[] pvUserData;
            public byte[] rgbAtr;
            public uint dwCurrentState;
            public uint dwEventState;
            public uint cbAtr;
        }

   byte[] atr = null;
   SCARD_READERSTATE[] rs = new SCARD_READERSTATE[1];
   rs[0].szReader = readersList[0];
   rs[0].dwCurrentState = SCARD_STATE_UNAWARE;
   rs[0].dwEventState = SCARD_STATE_PRESENT;
   int hctx = hContext.ToInt32();
   var cardResult = SCardGetStatusChange(hctx, 100, rs, 1);
   if (cardResult == 0 && rs[0].cbAtr > 0 && rs[0].rgbAtr != null)
   {
       atr = new byte[rs[0].cbAtr];
       Array.Copy(rs[0].rgbAtr, atr, rs[0].cbAtr);
   }

  while ( (rs[0].dwCurrentState & SCARD_STATE_PRESENT) == 0)
  {
       rs = new SCARD_READERSTATE[1];
       rs[0].szReader = readersList[0];
       //rs[0].dwCurrentState = SCARD_STATE_PRESENT;
       //rs[0].dwEventState = SCARD_STATE_PRESENT;
       SCardGetStatusChange(hctx, 100000000, rs, 1);
       System.Threading.Thread.Sleep(1000);
  }

es funktioniert, aber es hat einen fiesen Faden in ihm zu schlafen. Im Idealfall würde ich mag, um einen blockierenden Aufruf zu SCardGetStatusChange auf einem hintergrund-thread und Tauchen dann die Ereignisse.

Anscheinend durch Einstellung der szReader auf den Wert "\\?PnP -?\Meldung" Sie blockieren sollte, solange alles in der struct ist 0.

Habe ich geändert, den code zu

   rs[0].szReader = "\\\\?PnP?\\Notification";
   rs[0].cbAtr = 0;
   rs[0].dwCurrentState = 0;
   rs[0].dwEventState = 0;
   rs[0].pvUserData = new byte[0];
   rs[0].rgbAtr = new byte0];
   SCardGetStatusChange(hctx, 100000000, rs, 1);

aber es gibt einen Erfolg das Ergebnis sofort. Kann jeder pInvoke-Meister gibt, sehen, was ist falsch?

InformationsquelleAutor Dylan | 2013-05-04
Schreibe einen Kommentar