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?
- Ihre SCARD_READERSTATE Erklärung scheint falsch, diese stattdessen zu verwenden: pinvoke.net/default.aspx/Structures/SCARD_READERSTATE.html
- Wie werden Sie zurechtkommen mit diesem Dylan, vergessen Sie nicht, follow-up auf Ihre Fragen...
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Ihrem Beispiel-der zweite Aufruf
SCardGetStatusChange
blockieren sollte, wenn Sie kopieren dwEventState in dwCurrentState und dann reset dwEventState, so gibt es keine Notwendigkeit für den Schlaf.Dem "\\?PnP -?\Notification" Struktur ist zu sagen, wenn ein neues smart card - reader angehängt wurde, nicht, wenn eine Karte eingelegt wurde. Aus der MSDN-Seite auf SCardGetStatusChange:
Wenn Sie den "\\?PnP -?\Meldung" struct:
pvUserData
undrgbAttr
Felder gesetzt werden sollten, umnull
new byte[0]
ist ein Gültiger Zeiger auf eine null-Länge-array, aber was die API muss hier null-Zeiger oder null-Werte)rs[0].dwCurrentState = (readerCount << 16);