/// <summary> /// 获取键盘消息 /// </summary> /// <param name="nCode"></param> /// <param name="wParam"></param> /// <param name="lParam"></param> /// <returns></returns> private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam) { if (nCode >= 0) { #region old KeyboardHookStruct KeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct)); #region 暂时不用 //int vkCode = Marshal.ReadInt32(lParam); ////WM_KEYDOWN和WM_SYSKEYDOWN消息,将会引发OnKeyDownEvent事件 //if (OnKeyDownEvent != null && (wParam == InterceptWin32Api.WM_KEYDOWN || wParam == InterceptWin32Api.WM_SYSKEYDOWN)) //{ // // 此处触发键盘按下事件 // // keyData为按下键盘的值,对应 虚拟码 // CustomizeKeyEventArgs e = new CustomizeKeyEventArgs(vkCode); // OnKeyDownEvent(this, e); //} //WM_KEYUP和WM_SYSKEYUP消息,将引发OnKeyUpEvent事件 //if (OnKeyUpEvent != null && (wParam == InterceptWin32Api.WM_KEYUP || wParam == InterceptWin32Api.WM_SYSKEYUP)) //{ // // 此处触发键盘抬a起事件 // CustomizeKeyEventArgs e = new CustomizeKeyEventArgs(vkCode); // OnKeyUpEvent(this, e); //} #endregion #region 输入 if (OnInputEvent != null && wParam == WM_KEYUP) { byte[] keyState = new byte[256]; GetKeyboardState(keyState); byte[] inBuffer = new byte[2]; if (ToAscii(KeyboardHookStruct.vkCode, KeyboardHookStruct.scanCode, keyState, inBuffer, KeyboardHookStruct.flags) == 1) { KeyPressEventArgs e = new KeyPressEventArgs((char)inBuffer[0]); OnInputEvent(this, new BoardInputEventArgs() { KeyChar = e.KeyChar }); } } #endregion #endregion } return(InterceptWin32Api.CallNextHookEx(hKeyboardHook, nCode, wParam, lParam)); }
public void Stop() { bool retKeyboard = true; if (hKeyboardHook != 0) { retKeyboard = InterceptWin32Api.UnhookWindowsHookEx(hKeyboardHook); hKeyboardHook = 0; } if (!(retKeyboard)) { throw new Exception("卸载钩子失败!"); } }
static int hKeyboardHook = 0; //声明键盘钩子处理的初始值 /// <summary> /// 安装键盘钩子 /// </summary> public void Start() { if (hKeyboardHook == 0) { KeyboardHookProcedure = new InterceptWin32Api.HookProc(KeyboardHookProc); ProcessModule cModule = Process.GetCurrentProcess().MainModule; var mhIntPrt = InterceptWin32Api.GetModuleHandle(cModule.ModuleName); hKeyboardHook = InterceptWin32Api.SetWindowsHookEx(InterceptWin32Api.WH_KEYBOARD_LL, KeyboardHookProcedure, mhIntPrt, 0); if (hKeyboardHook == 0) { Stop(); throw new Exception("安装键盘钩子失败"); } } }