我的全局键盘钩子(KeyBoardHook)

1,钩子操作类

public  class KeyPressSender
    {

        [StructLayout(LayoutKind.Sequential)]
        public class KeyBoardHookStruct
        {
            public int vkCode;
            public int scanCode;
            public int flags;
            public int time;
            public int dwExtraInfo;
        }
        //事件输出
        public event KeyEventHandler KeyUpEvent;

        //委托 
        public delegate int HookProc(int nCode, int wParam, IntPtr lParam);
        static int hHook = 0;
        public const int WH_KEYBOARD_LL = 13;
        //LowLevel键盘截获,如果是WH_KEYBOARD=2,并不能对系统键盘截取,Acrobat Reader会在你截取之前获得键盘。 
        static HookProc KeyBoardHookProcedure;

        //设置钩子 
        [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)]
        //抽掉钩子 
        public static extern bool UnhookWindowsHookEx(int idHook);
        [DllImport("user32.dll")]
        //调用下一个钩子 
        public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);
        [DllImport("kernel32.dll")]
        public static extern int GetCurrentThreadId();
        [DllImport("kernel32.dll")]
        public static extern IntPtr GetModuleHandle(string name);

        public void Hook_Start()
        {
            if (hHook == 0)
            {
                KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);
                hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardHookProcedure,
                        GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
                //如果设置钩子失败. 
                if (hHook == 0)
                {
                    Hook_Clear();
                }
            }
        }

        /// <summary>
        /// 取消钩子事件
        /// </summary>
        public void Hook_Clear()
        {
            bool retKeyboard = true;
            if (hHook != 0)
            {
                retKeyboard = UnhookWindowsHookEx(hHook);
                hHook = 0;
            }
        }

        public int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
        {
            if (nCode >= 0)
            {
                KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));
                Keys KeyData = (Keys)Enum.Parse(typeof(Keys), kbh.vkCode.ToString());
                // 键盘抬起
                if (KeyUpEvent != null)/* && wParam == WM_KEYUP)*/
                {
                    //Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
                    //if (keyData == Keys.Up)
                    //{
                    KeyEventArgs e = new KeyEventArgs(KeyData);//绑定事件
                    KeyUpEvent(this, e);
                    //MessageBox.Show("捕捉到了按键释放");
                    //}
                }
                #region 数据操作
                //switch (k)
                //{
                //    case Keys.F2:
                //        if (kbh.flags == 0)
                //        {
                //             

                //        }
                //        else if (kbh.flags == 128)
                //        {
                //            //放开后做什么事
                //        }
                //        return 1;
                //}
                #endregion
            }
            return CallNextHookEx(hHook, nCode, wParam, lParam);
        }

    }

2 引用方法:

创建事件与实例化

private KeyEventHandler myKeyEventHandeler = null;//按键钩子
                                                          //private KeyboardHook k_hook = new KeyboardHook();
        private KeyPressSender k_hook = new KeyPressSender();

初始化需要挂接事件

  myKeyEventHandeler = new KeyEventHandler(hook_KeyUp);
            k_hook.KeyUpEvent += myKeyEventHandeler;//钩住键按下
            k_hook.Hook_Start();//安装键盘钩子

获取键盘输入后操作的方法

private void hook_KeyUp(object sender, KeyEventArgs e)
        {
            //  这里写具体实现
            string Log = $"按下了键盘 {e.KeyCode},并已触发。";
            Common.LogWrite.WriteLog(Log);
            string PressKeyData = e.KeyCode.ToString().ToUpper();
            }

关闭钩子

 k_hook.Hook_Clear();//卸载键盘钩子
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值