资讯详情

我的全局键盘钩子(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();//卸载键盘钩子

标签: kbh智能压力变送器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

 锐单商城 - 一站式电子元器件采购平台  

 深圳锐单电子有限公司