久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

C#下usb條碼掃描槍的鉤子實(shí)現(xiàn)的改進(jìn)

 KILLKISS 2016-12-09

  【目前的條形碼掃描器有點(diǎn)類似外接鍵盤(其實(shí)從消息傳送上它就相當(dāng)于一個(gè)鍵盤),,把輸入焦點(diǎn)定位到可輸入的控件上,一掃描相應(yīng)的條形碼信息就輸入到文本框中去了,,但是如果沒有輸入焦點(diǎn),,或另一個(gè)不相干的程序獲得輸入焦點(diǎn),,那就有點(diǎn)亂套了。我想實(shí)現(xiàn)的是,,不管什么情況,,只要掃描器一工作,,我的程序就能自動(dòng)激活,并能獲得當(dāng)前輸入的條形碼信息,。 實(shí)現(xiàn)思路:我用的是litele牌的USB口的紅外條形碼掃描器,,仔細(xì)分析了一下,掃描成功后,,以鍵盤按鍵消息的形式把條形碼輸入信息通知給系統(tǒng),。這樣通過鍵盤鉤子就可以方便的獲得該信息了。但是,,怎樣區(qū)分信息是鍵盤還是條形碼輸入的哪,?很簡(jiǎn)單,條形碼掃描器在很短的時(shí)間內(nèi)輸入了至少3個(gè)字符以上信息,,并且以“回車”作為結(jié)束字符,,在這種思想指引下,很完美的實(shí)現(xiàn)了預(yù)定功能,?!?/p>


frmMain:

  1. public BarCodeHook BarCode = new BarCodeHook();  
  2. public delegate void ShowInfoDelegate(BarCodeHook.BarCodes barCode);  
  3. void ShowInfo(BarCodeHook.BarCodes barCode){  
  4.  textBox_barCode.Text = barCode.BarCode;  
  5.  buttonX2.Focus();  
  6. }  
  7. public void BarCode_BarCodeEvent(BarCodeHook.BarCodes barCode)  
  8. {  
  9.     ShowInfo(barCode);  
  10. }  
  11.   
  12.   
  13. public frmMain()  
  14. {  
  15.     InitializeComponent();  
  16.     BarCode.BarCodeEvent += new BarCodeHook.BarCodeDelegate(BarCode_BarCodeEvent);  
  17.   
  18. }  

如果焦點(diǎn)本來就在textBox上,會(huì)產(chǎn)生多余的字符,,所以在showInfo函數(shù)里,,每次都手動(dòng)讓buttonX2成為焦點(diǎn)。




  1. public class BarCodeHook  
  2.    {  
  3.        public delegate void BarCodeDelegate(BarCodes barCode);  
  4.        public event BarCodeDelegate BarCodeEvent;  
  5.   
  6.        public struct BarCodes  
  7.        {  
  8.            public int VirtKey;      //虛擬碼  
  9.            public int ScanCode;     //掃描碼  
  10.            public string KeyName;   //鍵名  
  11.            public uint AscII;       //AscII  
  12.            public char Chr;         //字符  
  13.   
  14.            public string BarCode;   //條碼信息  
  15.            public bool IsValid;     //條碼是否有效  
  16.            public DateTime Time;    //掃描時(shí)間  
  17.        }  
  18.   
  19.        private struct EventMsg  
  20.        {  
  21.            public int message;  
  22.            public int paramL;  
  23.            public int paramH;  
  24.            public int Time;  
  25.            public int hwnd;  
  26.        }  
  27.         
  28.        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]  
  29.        private static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);  
  30.   
  31.        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]  
  32.        private static extern bool UnhookWindowsHookEx(int idHook);  
  33.   
  34.        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]  
  35.        private static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);  
  36.   
  37.        [DllImport("user32", EntryPoint = "GetKeyNameText")]  
  38.        private static extern int GetKeyNameText(int lParam, StringBuilder lpBuffer, int nSize);  
  39.   
  40.        [DllImport("user32", EntryPoint = "GetKeyboardState")]  
  41.        private static extern int GetKeyboardState(byte[] pbKeyState);  
  42.   
  43.        [DllImport("user32", EntryPoint = "ToAscii")]  
  44.        private static extern bool ToAscii(int VirtualKey, int ScanCode, byte[] lpKeyState, ref uint lpChar, int uFlags);  
  45.   
  46.        delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);  
  47.        BarCodes barCode = new BarCodes();  
  48.        int hKeyboardHook = 0;  
  49.        public string strBarCode = "";  
  50.        public int length;  
  51.   
  52.        private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)  
  53.        {  
  54.            barCode.IsValid = false;  
  55.            bool notChar = false;  
  56.            if (nCode == 0)  
  57.            {  
  58.                EventMsg msg = (EventMsg)Marshal.PtrToStructure(lParam, typeof(EventMsg));  
  59.   
  60.                if (wParam == 0x100)   //WM_KEYDOWN = 0x100  
  61.                {  
  62.                    barCode.VirtKey = msg.message & 0xff;  //虛擬碼  
  63.                    barCode.ScanCode = msg.paramL & 0xff;  //掃描碼  
  64.   
  65.                    StringBuilder strKeyName = new StringBuilder(255);  
  66.                    if (GetKeyNameText(barCode.ScanCode * 65536, strKeyName, 255) > 0)  
  67.                    {  
  68.                        barCode.KeyName = strKeyName.ToString().Trim(new char[] { ' ', '\0' });  
  69.                    }  
  70.                    else  
  71.                    {  
  72.                        barCode.KeyName = "";  
  73.                    }  
  74.   
  75.                    byte[] kbArray = new byte[256];  
  76.                    uint uKey = 0;  
  77.                    GetKeyboardState(kbArray);  
  78.                    if (ToAscii(barCode.VirtKey, barCode.ScanCode, kbArray, ref uKey, 0))  
  79.                    {  
  80.                        barCode.AscII = uKey;  
  81.                        barCode.Chr = Convert.ToChar(uKey);  
  82.                    }  
  83.                    else  
  84.                    {  
  85.                        notChar = true;   //轉(zhuǎn)到ascii字符失敗,,這不是一個(gè)正常字符,,要去掉  
  86.                    }  
  87.   
  88.   
  89.                            if (DateTime.Now.Subtract(barCode.Time).TotalMilliseconds > 30)     //30ms可以過濾掉連續(xù)按住一個(gè)鍵時(shí)的情況  
  90.                            {  
  91.                                if (notChar == false)  
  92.                                    strBarCode = barCode.Chr.ToString();  
  93.                                else  
  94.                                    strBarCode = "";  
  95.                                barCode.IsValid = false;  
  96.                            }  
  97.                            else  
  98.                            {  
  99.                                if (strBarCode.Length >= 5)    
  100.                                {  
  101.                                    barCode.IsValid = true;      //isValid為true表明這是個(gè)條碼  
  102.                                }  
  103.                                if (notChar == false)  
  104.                                {  
  105.                                    strBarCode += barCode.Chr.ToString();  
  106.                                }  
  107.                                barCode.BarCode = strBarCode;  
  108.                            }  
  109.   
  110.   
  111.                      
  112.   
  113.   
  114.                    barCode.Time = DateTime.Now;  
  115.                    if (BarCodeEvent != null && barCode.IsValid) BarCodeEvent(barCode);    //觸發(fā)事件  
  116.                      
  117.                }  
  118.            }  
  119.            return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);            
  120.        }  
  121.          
  122.        // 安裝鉤子   
  123.        public bool Start()  
  124.        {  
  125.            if (hKeyboardHook == 0)  
  126.            {  
  127.                //WH_KEYBOARD_LL = 13  
  128.                hKeyboardHook = SetWindowsHookEx(13, new HookProc(KeyboardHookProc), Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);  
  129.            }  
  130.            return (hKeyboardHook != 0);  
  131.        }  
  132.   
  133.        // 卸載鉤子   
  134.        public bool Stop()  
  135.        {  
  136.            if (hKeyboardHook != 0)  
  137.            {  
  138.                bool result = UnhookWindowsHookEx(hKeyboardHook);  
  139.                hKeyboardHook = 0;         //將hKeyboardHook 置為0  
  140.                if (result)  
  141.                {  
  142.   
  143.                    //MessageBox.Show("true");  
  144.                }  
  145.                return result;  
  146.            }  
  147.              
  148.            return true;  
  149.        }  
  150.    }  

是如果掃到的是英文字符的話,會(huì)有一個(gè)多余的碼無法從鍵盤碼轉(zhuǎn)到ascii碼,,需要去掉這個(gè)碼,。同時(shí)設(shè)為30ms可以過濾掉一直按住一個(gè)鍵的情況。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多