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;
            }
        }
    }



  • 相关阅读:
    windows 程序设计自学:窗口正中显示Hello,World
    为网站图片增加延迟加载功能,提升用户体验
    线性表顺序存储
    sys.stdout sys.stderr的用法
    python 跳出嵌套循环方法
    * 与 ** 在调用函数时的作用
    twisted 学习笔记二:创建一个简单TCP客户端
    给命令行上色
    __new__ 的简单应用
    网友对twisted deferr的理解
  • 原文地址:https://www.cnblogs.com/zhaoshujie/p/9594726.html
Copyright © 2011-2022 走看看