二代证识别相关代码

    public class Card
    {
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 8)]
        public struct PERSONINFOW
        {
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
            public string name;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)]
            public string sex;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
            public string nation;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
            public string birthday;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 36)]
            public string address;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
            public string cardId;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
            public string police;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
            public string validStart;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
            public string validEnd;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)]
            public string sexCode;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
            public string nationCode;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 36)]
            public string appendMsg;
        }
        [DllImport("cardapi3.dll", EntryPoint = "OpenCardReader",
            CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        public static extern Int32 OpenCardReader(Int32 lPort, UInt32 ulFlag, UInt32 ulBaudRate);
        [DllImport("cardapi3.dll", EntryPoint = "GetPersonMsgW",
            CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        public static extern Int32 GetPersonMsgW(ref PERSONINFOW pInfo, string pszImageFile);
        [DllImport("cardapi3.dll", EntryPoint = "GetPersonMsgA",
        CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        public static extern Int32 GetPersonMsgA(ref PERSONINFOW pInfo, string pszImageFile);
        [DllImport("cardapi3.dll", EntryPoint = "CloseCardReader",
            CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        public static extern Int32 CloseCardReader();
        [DllImport("cardapi3.dll", EntryPoint = "GetErrorTextW",
            CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        public static extern void GetErrorTextW(StringBuilder pszBuffer, UInt32 dwBufLen);
        [DllImport("cardapi3.dll", EntryPoint = "GetCardReaderStatus",
           CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        public static extern long GetCardReaderStatus(long lPort, ulong ulBaudRate);


    }
 public class CardMonitorService
    {
        #region Fields
        private Card.PERSONINFOW person;
        private int port = Convert.ToInt32(ConfigurationManager.AppSettings["port"].ToString());
        private UInt32 flag = Convert.ToUInt32(ConfigurationManager.AppSettings["flag"].ToString());
        private UInt32 BaudRate = Convert.ToUInt32(ConfigurationManager.AppSettings["BaudRate"].ToString());
        #endregion

        public void ServiceStart(ref Card.PERSONINFOW person, string imagePath)
        {
            ThreadInvoke(ref  person, imagePath);
        }

        private void ThreadInvoke(ref Card.PERSONINFOW person, string imagePath)
        {
            if (!OpenDevice())
                return;
            int result = Card.GetPersonMsgW(ref person, imagePath);
            if (result == 0)
            {
                //run = false;
                CloseDevice();
            }
        }
        //关闭设备
        private void CloseDevice()
        {
            Card.CloseCardReader();
        }

        //打开设备
        private bool OpenDevice()
        {
            int result = Card.OpenCardReader(port, flag, BaudRate);
            if (result == 0)
                return true;
            else
                return false;
        }

        public delegate void Elapsed(); //定义委托  
        public event Elapsed OnElapsed;

        private long _Interval = 1000;
        public long Interval
        {
            get { return _Interval; }
            set { _Interval = value; }
        }

        private bool _IsStart = false;
        private Thread _TimerThread;
        public void Start()
        {
            if (_IsStart)
                return;

            _IsStart = true;

            _TimerThread = new Thread(new ThreadStart(DoTimer));
            _TimerThread.Start();
        }


        public void Stop()
        {
            try
            {
                if (!_IsStart)
                    return;

                _IsStart = false;

                _TimerThread.Abort();
            }
            catch (Exception e)
            { }
        }

        private void DoTimer()
        {
            try
            {
                int last = Environment.TickCount;
                while (_IsStart)
                {
                    if (Environment.TickCount - last > _Interval)
                    {
                        if (OnElapsed != null)
                            OnElapsed();

                        last = Environment.TickCount;

                    }
                    Thread.Sleep(100);
                }


            }
            catch (Exception e)
            { }
        }

    }

            _Timer = new CardMonitorService();
            _Timer.Interval = _Interval;
            _Timer.Start(); //开始
            _Timer.OnElapsed += Timer_OnElapsed;
 private void Timer_OnElapsed()
        {


            Invoke(new Action(() =>
            {
                // to do....
            });

猜你喜欢

转载自blog.csdn.net/wupd2014/article/details/72911114
今日推荐