最近在给瑞表做一个global project,主要工作是在Warehouse模块中加入现场的称重以及Barcode Collection和Transmission.
Barcode Scanner用的是Postech的HS02标配。
客户希望能够达到现场操作具备手动和后台自动俩种模式,考虑到现场的使用环境和供电情况,我们放弃了串口采用键盘线的连接方式。
作为Soluation的一部分,以下是全局钩子获取条码(通过条码结构定义区别键盘输入和Scanner输入)的源代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Diagnostics;
using Microsoft.Win32;
using System.Text.RegularExpressions;
namespace BarcodeReader
{
    /// <summary>
    /// Barcode Reader Module
    /// </summary>
    public class BarcodeReader
    {
        private List<string> strBarcode;
        private string strTempBarcode;
        private string strMessage;
        private string barcodeformat1;
        private string barcodeformat2;
        /// <summary>
        /// Barcode Value
        /// </summary>
        public virtual List<string> Barcode
        {
            get
            {
                return strBarcode;
            }
            set
            {
                strBarcode = value;
            }
        }
        /// <summary>
        /// Errpr Message
        /// </summary>
        public virtual string Message
        {
            get
            {
                return strMessage;
            }
            set
            {
                strMessage = value;
            }
        }
        /// <summary>
        /// Module Initial
        /// </summary>
        public BarcodeReader(string formatofbarcodeA, string formatofbarcodeB)
        {
            strBarcode = new List<string>();
            strTempBarcode = string.Empty;
            strMessage = string.Empty;
            barcodeformat1 = formatofbarcodeA;
            barcodeformat2 = formatofbarcodeB;
        }
        #region Customize Module
        /// <summary>
        /// Keyboard Start
        /// </summary>
        public virtual void Hook_Start()
        {
            // Install Keyboard
            if (hHook == 0)
            {
                KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);
                hHook = SetWindowsHookEx(WH_KEYBOARD_LL,
                KeyBoardHookProcedure,
                GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
                #region Thread Hook
                //hHook = SetWindowsHookEx(2,
                //KeyBoardHookProcedure,
                //GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), GetCurrentThreadId());
                #endregion
                // Failure
                if (hHook == 0)
                {
                    Hook_Clear();
                    strMessage  = "Fail to Install KeyBoard!";
                }
            }
        }
        /// <summary>
        /// Mouse Hook Start
        /// </summary>
        public virtual void MouseHook_Start()
        {
            // Install Mouse
            if (mousehook == 0)
            {
                MouseHookProcedure = new HookProc(MouseHookProc);
                mousehook = SetWindowsHookEx(WH_MOUSE_LL,
                MouseHookProcedure,
                GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
                #region Thread Hook
                //mousehook = SetWindowsHookEx(2,
                // KeyBoardHookProcedure,
                // GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), GetCurrentThreadId());
                #endregion
                // failure.
                if (mousehook == 0)
                {
                    MouseHook_Clear();
                    strMessage = "Fail to Install Mouse!";
                }
            }
        }
        /// <summary>
        /// Hook Clear
        /// </summary>
        public virtual void Hook_Clear()
        {
            bool retKeyboard = true;
            if (hHook != 0)
            {
                retKeyboard = UnhookWindowsHookEx(hHook);
                hHook = 0;
            }
            // failure
            if (!retKeyboard) strMessage = "Fail to Uninstall Keyboard!";
        }
        /// <summary>
        /// Mouse Hook Clear
        /// </summary>
        public virtual void MouseHook_Clear()
        {
            bool retMouseboard = true;
            if (mousehook != 0)
            {
                retMouseboard = UnhookWindowsHookEx(mousehook);
                mousehook = 0;
            }
            // failure
            if (!retMouseboard) strMessage = "Fail to Uninstall Mouse!";
        }
        /// <summary>
        /// KeyBoard Procedure
        /// </summary>
        /// <param name="nCode"></param>
        /// <param name="wParam"></param>
        /// <param name="lParam"></param>
        /// <returns></returns>
        public virtual int KeyBoardHookProc(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if (nCode >= 0)
            {
                if ((int)wParam == 0x100 || (int)wParam == 0x104)
                {
                    KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));
                    //Catch Enter Key
                    if (kbh.vkCode == (int)System.Windows.Forms.Keys.Enter)
                    {
                        if (strTempBarcode != "")
                        {
                            //Transmit Barcode to main thread
                            string strTemp = string.Empty;
                            strTemp = string.Copy(strTempBarcode);
                            strTempBarcode = string.Empty;
                                                   
                            if (Regex.IsMatch(strTemp, barcodeformat1))
                            {
                                if (strBarcode.Count == 0)
                                {
                                    strBarcode.Add(strTemp);
                                    strBarcode.Add("");
                                }
                                else
                                {
                                    strBarcode[0] =  strTemp;
                                }
                            }
                            else if (Regex.IsMatch(strTemp, barcodeformat2))
                            {
                                if (strBarcode.Count != 2)
                                {
                                    if (strBarcode.Count == 0)
                                    {
                                        strBarcode.Add("");
                                        strBarcode.Add(strTemp);
                                    }
                                    else
                                    {
                                        strBarcode.Add(strTemp);
                                    }
                                }
                                else
                                {
                                    strBarcode[1] = strTemp;
                                }
                            }                           
                        }
                        // Scan Result Check
                        if (strBarcode.Count == 2)
                        {
                            if (!string.IsNullOrEmpty(strBarcode[0]) && !string.IsNullOrEmpty(strBarcode[1]))
                            {
                                strMessage = "Barcode has been read";
                            }
                            else if (string.IsNullOrEmpty(strBarcode[0]))
                            {
                                strMessage = "Please read first Barcode";
                            }
                            else if (string.IsNullOrEmpty(strBarcode[1]))
                            {
                                strMessage = "Please read second Barcode";
                            }
                            else
                            {
                                strMessage = "Please read Both of Barcode";
                            }
                        }
                        else
                        {
                            strMessage = "Please read Both of Barcode";
                        }
                    }
                    else
                    {
                        if ((kbh.vkCode >= 8 && kbh.vkCode <= 47) || (kbh.vkCode >= 112 && kbh.vkCode <= 123))
                        {
                        }
                        else
                        {
                            StringBuilder strKeyName = new StringBuilder(225);
                            if (GetKeyNameText(kbh.scanCode * 65536, strKeyName, 255) > 0)
                            {
                                strTempBarcode = strTempBarcode + strKeyName.ToString().Trim(new char[] { ' ', '\0' });
                            }
                        }
                    }
                }
            }
            //if (nCode >= 0)
            //{
            //    KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));
            //    //if (kbh.vkCode == (int)Keys.S && (int)Control.ModifierKeys == (int)Keys.Control) // 截获F8
            //    //{
            //    // MessageBox.Show("快捷键已拦截!不能保存!");
            //    // return 1;
            //    //}
            //    if (kbh.vkCode == (int)Keys.Delete
            //    && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt) //截获Ctrl+Alt+Y
            //    {
            //        MessageBox.Show("!DeleteDeleteDeleteDeleteDelete");
            //        return 1;
            //    }
            //    if (kbh.vkCode == (int)Keys.F10)
            //    {
            //        //SendMessage(btn1Handle, WM_LBUTTONDBLCLK, 0, 0);
            //        //SendMessage(btn1Handle, WM_LBUTTONUP, 0, 0);
            //        SendMessage(this.Handle, 500, 0, 0);
            //        return 1;
            //    }
            //    if (kbh.vkCode == (int)Keys.F11)
            //    {
            //        //SendMessage(btn1Handle, WM_LBUTTONDBLCLK, 0, 0);
            //        //SendMessage(btn1Handle, WM_LBUTTONUP, 0, 0);
            //        SendMessage(this.Handle, 501, 0, 0);
            //        return 1;
            //    }
            //}
            return CallNextHookEx(hHook, nCode, wParam, lParam);
        }
        /// <summary>
        /// Mouse Procedure
        /// </summary>
        /// <param name="nCode"></param>
        /// <param name="wParam"></param>
        /// <param name="lParam"></param>
        /// <returns></returns>
        public virtual int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if (nCode >= 0)
            {
                // MouseHookStruct kbh = (MouseHookStruct)Marshal.PtrToStructure(wParam, typeof(MouseHookStruct));
                //if (kbh.vkCode == (int)Keys.S && (int)Control.ModifierKeys == (int)Keys.Control) // 截获F8
                //{
                // MessageBox.Show("快捷键已拦截!不能保存!");
                // return 1;
                //}
                //if (kbh.vkCode == (int)Keys.Delete
                // && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt) //截获Ctrl+Alt+Y
                //{
                // MessageBox.Show("!DeleteDeleteDeleteDeleteDelete");
                // return 1;
                //}
                if ((int)wParam == (int)WM_MOUSE.WM_MOUSEMOVE)
                {
                    //SendMessage(btn1Handle, WM_LBUTTONDBLCLK, 0, 0);
                    //SendMessage(btn1Handle, WM_LBUTTONUP, 0, 0);
                    //if (!this.Bounds.Contains(Form.MousePosition))
                    //{
                    //SendMessage(this.Handle, 500, 0, 0);
                    //return 1;
                    //}
                }
                //if ((int)wParam == (int)WM_MOUSE.WM_RBUTTONDOWN)
                //{
                // //SendMessage(btn1Handle, WM_LBUTTONDBLCLK, 0, 0);
                // //SendMessage(btn1Handle, WM_LBUTTONUP, 0, 0);
                // SendMessage(this.Handle, 501, 0, 0);
                // return 1;
                //}
            }
            return CallNextHookEx(mousehook, nCode, wParam, lParam);
        }
        private const uint WM_LBUTTONUP = 0X202;
        private const uint WM_LBUTTONDBLCLK = 0X201;
        #endregion
        #region Delegate
        //Delegate
        public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);
        static int hHook = 0;
        static int mousehook = 0;
        public const int WH_KEYBOARD_LL = 13;
        private const int WH_MOUSE_LL = 14;
        HookProc KeyBoardHookProcedure;
        HookProc MouseHookProcedure;
        //键盘Hook结构函数
        [StructLayout(LayoutKind.Sequential)]
        public class KeyBoardHookStruct
        {
            public int vkCode;
            public int scanCode;
            public int flags;
            public int time;
            public int dwExtraInfo;
        }
        ///
        /// 鼠标钩子事件结构定义
        ///
        /// 详细说明请参考MSDN中关于 MSLLHOOKSTRUCT 的说明
        [StructLayout(LayoutKind.Sequential)]
        public struct MouseHookStruct
        {
            ///
            /// Specifies a POINT structure that contains the x- and y-coordinates of the cursor, in screen coordinates.
            ///
            public POINT Point;
            public UInt32 MouseData;
            public UInt32 Flags;
            public UInt32 Time;
            public UInt32 ExtraInfo;
        }
        [StructLayout(LayoutKind.Sequential)]
        public struct POINT
        {
            public int X;
            public int Y;
        }
        #endregion
        #region DllImport
        //Hook Setting
        [DllImport("user32.dll")]
        public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        //Hook Uninstall
        public static extern bool UnhookWindowsHookEx(int idHook);
        [DllImport("user32.dll")]
        //Hook Call
        public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);
        [DllImport("kernel32.dll")]
        public static extern int GetCurrentThreadId();
        [DllImport("kernel32.dll")]
        public static extern IntPtr GetModuleHandle(string name);
        [DllImport("User32.dll")]
        private static extern IntPtr SendMessage(IntPtr hwnd, uint msg, int wParam, int lParam);
        [DllImport("User32.dll")]
        private static extern int GetKeyNameText(int IParam, StringBuilder lpBuffer, int nSize);
        #endregion
        #region MOUSEEVENT
        /// <summary>
        /// Mouse event
        /// </summary>
        public enum WM_MOUSE : int
        {
            ///
            /// 鼠标开始
            ///
            WM_MOUSEFIRST = 0X200,
            ///
            /// 鼠标移动
            ///
            WM_MOUSEMOVE = 0X200,
            ///
            /// 左键按下
            ///
            WM_LBUTTONDOWN = 0X201,
            ///
            /// 左键释放
            ///
            WM_LBUTTONUP = 0X202,
            ///
            /// 左键双击
            ///
            WM_LBUTTONDBLCLK = 0X203,
            ///
            /// 右键按下
            ///
            WM_RBUTTONDOWN = 0X204,
            ///
            /// 右键释放
            ///
            WM_RBUTTONUP = 0X205,
            ///
            /// 右键双击
            ///
            WM_RBUTTONDBLCLK = 0X206,
            ///
            /// 中键按下
            ///
            WM_MBUTTONDOWN = 0X207,
            ///
            /// 中键释放
            ///
            WM_MBUTTONUP = 0X208,
            ///
            /// 中键双击
            ///
            WM_MBUTTONDBLCLK = 0X209,
            ///
            /// 滚轮滚动
            ///
            /// WINNT4.0以上才支持此消息
            WM_MOUSEWHEEL = 0x020A
        }
        #endregion
    }
}

HS02扫描枪:www.posunitech.com

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26312268/viewspace-2140376/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26312268/viewspace-2140376/

全局钩子+正则表达式=后台自动获取扫描枪数据相关推荐

  1. C#开源: 全局钩子+正则表达式=后台自动获取扫描枪数据

    最近在给瑞表做一个global project,主要工作是在Warehouse模块中加入现场的称重以及Barcode Collection和Transmission. Barcode Scanner用 ...

  2. 安卓版PDA扫码获取扫描枪数据;input获取焦点不弹出虚拟键盘;解决页面btn可操作数据的逻辑,导致DOM元素渲染,input的readonly失效

    html部分: 页面需要一个容器来接收扫描数据 注意:安卓版PDA扫描不同于win系统版本,安卓版本获取扫描数据时并不是keyCode按键依次获取,而是一次性给出扫描的数据 <!--扫描枪数据接 ...

  3. Linux下读取USB扫描枪数据

    1.USB扫描枪   USB接口的扫描枪相当于键盘输入,在Windows或者Linux下,在成功安装驱动的前提下,打开文件编辑器如word.txt等.扫描枪读出到条码数据时,数据即被捕获到光标处. 2 ...

  4. JQuery获取扫描枪扫描的数据

    1).首先我们得知道扫描枪的性质跟键盘是一样的,都是输入设备(可以等价理解为扫描枪就是键盘).然后每次扫描完都会自动输入一个回车按钮.例如我们扫描一个条形码(中国商品的条形码上的数值都是13位的),相 ...

  5. c# 获取串口扫描枪数据

    之前负责过一个机场的项目,有一个环节是扫描旅客登机牌,获取旅客信息的操作,当时是拟定了使用串口扫描枪来获取登机牌信息,后面又测试了网口的,这里记录一下当时用来测试串口使用的程序,供有需求的小伙伴们参考 ...

  6. java获取扫描枪的数据到数据库

     基本思路: 1.通过按钮获取输入框焦点 2.扫描二维码或条形码,并设置回车键(大部分扫描枪已自动设置) 3.在输入框设置回车 事件 4.获取输入框的值,将数据传入数据库  代码如下: jsp: &l ...

  7. python获取usb扫描枪数据_GitHub - RobinGitHub/USB4ScanGun: USB扫描枪识别,已获取对应扫描枪返回值的测试程序...

    USB4ScanGun PS:最近在测试点东西,要看这个项目的朋友麻烦用稍早前的版本.之后测试结果也会写在这里,或者博客中的.--2014年9月28日 USB扫描枪识别,已获取对应扫描枪返回值的测试程 ...

  8. QT 读取扫描枪数据

    扫码枪其实就是类似键盘输入,有些扫描枪可以设置扫完后自动添加换行 void TBcabinet::keyPressEvent(QKeyEvent *keyValue) {if (keyValue-&g ...

  9. 西门子-扫描枪数据读取 ----古月金真

    1.1. 实训目标 1.职业技能:掌握扫描枪的使用方法 2.职业知识:了解本课程的学习的主要内容,掌握扫描枪的工作原理及动 手能力. 3.职业道德:培养学生对的认知分析能力,并能从硬件到软件的过渡,认 ...

最新文章

  1. 20应用统计考研复试要点(part15)--应用多元分析
  2. 多媒体计算机在英语学科的应用,多媒体计算机应用于初中英语学科学习教学的研究...
  3. vue 父链和子组件索引_vue子组件和父组件双向绑定的几种方案
  4. Html和CSS在浏览器中常见的兼容性问题处理
  5. Struts2 Action与Servlet API耦合
  6. mysql条件变量单引号_mysql语法
  7. win11快捷键失效怎么处理 Windows快捷键失效的解决方法
  8. Linux下修改Mysql的用户(root)的密码的俩种方法
  9. oracle数据库如何写翻页_在oracle数据库中的分页SQL语句怎么写?
  10. 国内外卫星数据查询地址
  11. linux查看系统内存
  12. 08CMS之开发模式设置
  13. 计算机测色配色应用,计算机测色及配色.doc
  14. Type-C PD协议取电SINK受电端9V12V15V20V
  15. CSS外边距重叠和高度坍塌完美解决
  16. 听说根域名大部分在美国,美国能让中国从网络上消失?
  17. [置顶] 【游戏产业的5年之变】
  18. 一个故事讲完进程、线程和协程
  19. 松下与Delos中国携手,共同推动健康人居空间的研究和实证
  20. python趣味程序_python游戏趣味编程:疯狂的小圆圈

热门文章

  1. php网站mercury安装,mercury300m无线路由器设置教程 教你正确安装无线路由器
  2. Windows 10家庭中文版中启用WSL 2
  3. 争议最大的神经网络:绝顶聪明or傻透顶了 ?
  4. Deepstream 资料阅读记录
  5. 都说C++难,那么它到底难在了哪里?
  6. CodeChef 遇到 Language Rejected 怎么办
  7. gitlab添加邮箱设置
  8. 格灵深瞳出手,灵异视频告破
  9. 丹琦女神出品|开放域问答综述
  10. 软件测试项目交付,成功交付离岸项目的三个步骤