修改过的条码钩子

来源:互联网 发布:网络公司财务 编辑:程序博客网 时间:2024/05/03 00:49
public class BarCodeHook{    public delegate void BarCodeDelegate(BarCodes barCode);    public event BarCodeDelegate BarCodeEvent;    public struct BarCodes    {        public int VirtKey;      //虚拟码          public int ScanCode;     //扫描码          public string BarCode;   //条码信息          public bool IsValid;     //条码是否有效          public DateTime Time;    //扫描时间      }    private struct EventMsg    {        public int message;        public int paramL;        public int paramH;        public int Time;        public int hwnd;    }    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]    private static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]    private static extern bool UnhookWindowsHookEx(int idHook);    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]    private static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);    [DllImport("kernel32.dll")]    public static extern IntPtr GetModuleHandle(string name);    delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);    BarCodes barCode = new BarCodes();    int hKeyboardHook = 0;    List<char> _barcode = new List<char>(100);    private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)    {        if (nCode == 0)        {            EventMsg msg = (EventMsg)Marshal.PtrToStructure(lParam, typeof(EventMsg));            if (wParam == 0x100)   //WM_KEYDOWN = 0x100              {                barCode.VirtKey = msg.message & 0xff;  //虚拟码                  barCode.ScanCode = msg.paramL & 0xff;  //扫描码                  //if (DateTime.Now.Subtract(barCode.Time).TotalMilliseconds > 100)                //{                //    _barcode.Clear();                //}                //else                //{                //    if ((msg.message & 0xff) == 13 && _barcode.Count > 0)   //回车                  //    {                //        barCode.BarCode = new String(_barcode.ToArray());                //        barCode.IsValid = true;                //        _barcode.Clear();                //    }                //}                //barCode.Time = DateTime.Now;                //if (BarCodeEvent != null) BarCodeEvent(barCode);    //触发事件                  //barCode.IsValid = false;                //_barcode.Add(Convert.ToChar(msg.message & 0xff));                if ((msg.message & 0xff) == 13 && _barcode.Count > 0)   //回车                  {                    barCode.BarCode = new String(_barcode.ToArray());                    barCode.IsValid = true;                    _barcode.Clear();                    if (BarCodeEvent != null)                    {                        BarCodeEvent(barCode);//触发事件                      }                }                else                {                    barCode.IsValid = false;                    _barcode.Add(Convert.ToChar(msg.message & 0xff));                }            }        }        return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);    }    private static HookProc hookproc;    // 安装钩子       public bool Start()    {        if (hKeyboardHook == 0)        {            hookproc = new HookProc(KeyboardHookProc);            //WH_KEYBOARD_LL = 13              //hKeyboardHook = SetWindowsHookEx(13, hookproc, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);            hKeyboardHook = SetWindowsHookEx(13, hookproc, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);//解决返回0的问题        }        return (hKeyboardHook != 0);    }    // 卸载钩子       public bool Stop()    {        if (hKeyboardHook != 0)        {            return UnhookWindowsHookEx(hKeyboardHook);        }        return true;    }}

0 0