private void WaitChangeStatus(object sender, DoWorkEventArgs e) { while (!e.Cancel) { if (context == IntPtr.Zero) { return; } int result = WinSCard.SCardGetStatusChange(context, 1000, readerStates, readerStates.Length); for (int i = 0; i < readerStates.Length; i++) { // Check if the state changed from the last time. if ((readerStates[i].dwEventState & (int)WinSCard.CardState.Changed) == (int)WinSCard.CardState.Changed) { // Check what changed WinSCard.CardState state = WinSCard.CardState.None; if ((readerStates[i].dwEventState & (int)WinSCard.CardState.Present) == (int)WinSCard.CardState.Present && (readerStates[i].dwCurrentState & (int)WinSCard.CardState.Present) != (int)WinSCard.CardState.Present) { // The card was inserted state = WinSCard.CardState.Present; } else if ((readerStates[i].dwEventState & (int)WinSCard.CardState.Empty) == (int)WinSCard.CardState.Empty && (readerStates[i].dwCurrentState & (int)WinSCard.CardState.Empty) != (int)WinSCard.CardState.Empty) { // The card was removed state = WinSCard.CardState.Empty; } if (state != WinSCard.CardState.None && readerStates[i].dwCurrentState != (int)WinSCard.CardState.None) { switch (state) { case WinSCard.CardState.Present: if (CardInserted != null) { Connect(readerStates[i].szReader); CardInserted(readerStates[i].szReader, ATR); Disconnect(); } break; case WinSCard.CardState.Empty: if (CardRemoved != null) { CardRemoved(readerStates[i].szReader); } break; } } // Update the current state for the next time they are checked readerStates[i].dwCurrentState = readerStates[i].dwEventState; } } } }