zoukankan      html  css  js  c++  java
  • SetWindowsHookEx 相关

    SetWindowsHookEx function

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx

    无焦点下获取条码枪返回值的Hook(再次改良版)

    http://www.oschina.net/code/snippet_934211_27611

    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;
            }
        }
    }
  • 相关阅读:
    2015 年最受 Linux 爱好者欢迎的软硬件大盘点
    Java 9终于要包含Jigsaw项目了
    Linux 容器技术史话:从 chroot 到未来
    开发者最常用的 8 款 Sublime Text 3 插件
    60,000毫秒内对Linux的性能诊断效的方法
    bzoj 2595 [Wc2008]游览计划(斯坦纳树)
    bzoj 3997 [TJOI2015]组合数学(DP)
    bzoj 1014 [JSOI2008]火星人prefix(splay+hash)
    bzoj 1090 [SCOI2003]字符串折叠(区间DP)
    bzoj 1537 [POI2005]Aut- The Bus(DP+BIT)
  • 原文地址:https://www.cnblogs.com/xiefang2008/p/5998166.html
Copyright © 2011-2022 走看看