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

Barcode Scanner用的是摩托罗拉的LS 4278,Ls 2208 标配。

客户希望能够达到现场操作具备手动和后台自动俩种模式,考虑到现场的使用环境和供电情况,我们放弃了串口采用键盘线的连接方式。

作为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

}
}

转载于:https://www.cnblogs.com/David-Shaw/archive/2012/10/12/2720972.html

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

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

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

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

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

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

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

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

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

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

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

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

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

  7. 数据爬取遇到EventStream是个什么东西?EventSource与websocket有何区别?Java后台如何获取爬取数据并入库?EventStream后台服务怎么写?

    好久没更新了,今天办完房子装修手续,有点空咱们更新一下. 今天更新的内容是以前工作中采集数据的时候遇到的,目前我遇到的通过EventSource方式给前端提供数据的方式比较少,只见过这一种但是这种方式 ...

  8. JS如何获取扫描枪扫描的条形码

    //页面初始化 $.function({//1. 在页面初始化的时候调用一下代码:initScannerModule();})function initScannerModule(){var code ...

  9. S如何获取扫描枪扫描的数据

    https://blog.csdn.net/jifengdalu/article/details/83031664

最新文章

  1. 如何利用BP网络进行神经网络变量筛选
  2. element 如何自定义svg图标_4000+免费可自定义的图标集合
  3. Weighted distance in sklearn KNN
  4. 图解Detours实例
  5. 高并发项目Java是标配?.NET Core要将它拉下“神坛”!
  6. 特殊年份(java)
  7. 工信部:短信可为 16 亿用户提供行程证明;OPPO 回应造芯计划;Windows Terminal 0.9 发布| 极客头条...
  8. Linux系统配置及服务管理_第03章用户管理
  9. Linux内核使用的字符串转整形数和16进制数
  10. [转]Android的Handler总结
  11. shopnc B2B2C商城 Nginx下开启伪静态
  12. Android开源项目库汇总
  13. 弱监督学习总结(1)
  14. simulink upd通信
  15. layui表单—用户注册界面
  16. SCI检索号识别一法:UT-WOS与UT-ISI
  17. 对外汉语偏误语料库_对外汉语偏误汇总
  18. 利用计算机网线传东西,如何把文件通过一个网线从一个电脑传到另一个电脑上...
  19. ue4-摄像机动画Matinee(多图慎入)
  20. 网络口碑营销的特点、技巧、价值

热门文章

  1. 晒婚纱照了! ^_^
  2. 数据分析有哪些好书值得推荐?
  3. C语言——一元二次方程求解
  4. 基于matlab的数字调制,基于MATLAB的多功能数字调制系统信号源仿真
  5. 佰马智慧灯杆管理运维平台
  6. 用什么查看java dump文件
  7. 【libuv高效编程】libuv学习超详细教程3——libuv事件循环
  8. 计算机 名片,计算机版本的名片识别软件
  9. 华山论剑之契约式编程与防御式编程
  10. AttributeError: module ‘torchtext.data‘ has no attribute ‘Field‘ 解决