private void StartMonitor() { monitoring = true; SCardReaderState[] state = new SCardReaderState[readernames.Length]; for (int i = 0; i < readernames.Length; i++) { state[i] = new SCardReaderState(); state[i].ReaderName = readernames[i]; state[i].CurrentState = SCRState.Unaware; /* force SCardGetStatusChange to return * immediately with the current reader state */ } SCardError rc = context.GetStatusChange(IntPtr.Zero, state); if (rc == SCardError.Success) { // initialize event if (Initialized != null) { for (int i = 0; i < state.Length; i++) { Initialized(this, new CardStatusEventArgs(readernames[i], (state[i].EventState & (~(SCRState.Changed))), state[i].ATR)); previousState[i] = state[i].EventState & (~(SCRState.Changed)); // remove "Changed" previousStateValue[i] = state[i].EventStateValue; } } while (true) { for (int i = 0; i < state.Length; i++) { state[i].CurrentStateValue = previousStateValue[i]; } // block until status change occurs rc = context.GetStatusChange(SCardReader.Infinite, state); // Cancel? if (rc != SCardError.Success) { break; } for (int i = 0; i < state.Length; i++) { SCRState newState = state[i].EventState; newState &= (~(SCRState.Changed)); // remove "Changed" byte[] Atr = state[i].ATR; // Status change if (StatusChanged != null && (previousState[i] != newState)) { StatusChanged(this, new StatusChangeEventArgs(readernames[i], previousState[i], newState, Atr)); } // Card inserted if (((newState & SCRState.Present) == SCRState.Present) && ((previousState[i] & SCRState.Empty) == SCRState.Empty)) { if (CardInserted != null) { CardInserted(this, new CardStatusEventArgs(readernames[i], newState, Atr)); } } // Card removed if (((newState & SCRState.Empty) == SCRState.Empty) && ((previousState[i] & SCRState.Present) == SCRState.Present)) { if (CardRemoved != null) { CardRemoved(this, new CardStatusEventArgs(readernames[i], newState, Atr)); } } previousState[i] = newState; previousStateValue[i] = state[i].EventStateValue; } } } monitoring = false; if (rc != SCardError.Cancelled) { if (MonitorException != null) { MonitorException(this, new PCSCException(rc, "An error occured during SCardGetStatusChange(..).")); } } }