示例#1
0
        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;
                    }
                }
            }
        }