zoukankan      html  css  js  c++  java
  • 无焦点下获取条码枪返回值的Hook(再次改良版)

    针对上一个版本再次改良,上除掉无用代码,新手绝对可以看懂!

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Reflection;
     
    namespace BookLibraryManagement.CommonTools
    {
        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);
     
            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));
                    }
                }
                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);
                }
                return (hKeyboardHook != 0);
            }
     
            // 卸载钩子   
            public bool Stop()
            {
                if (hKeyboardHook != 0)
                {
                    return UnhookWindowsHookEx(hKeyboardHook);
                }
                return true;
            }
        }
    }



  • 相关阅读:
    火炬之光模型导出(Unity载入火炬之光的模型)
    树的左旋与右旋
    javaEE开发之导出excel工具类
    STL algorithm算法is_permutation(27)
    学做衣服论坛 -服装DIY教程,缤纷服装网,裁剪教程,家用缝纫机,买布料
    傲娇_百度百科
    《失败不是成功之母》阅读理解
    失败是不是成功之母
    正则表达式多语种的web版本
    date tod = boost::gregorian::day_clock::local_day(); //当前日期
  • 原文地址:https://www.cnblogs.com/zhaoshujie/p/9594726.html
Copyright © 2011-2022 走看看