private List <Keys> preKeysList = new List <Keys>();//存放被按下的控制键,用来生成具体的键 private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam) { //如果该消息被丢弃(nCode<0)或者没有事件绑定处理程序则不会触发事件 if ((nCode >= 0) && (OnKeyDownEvent != null || OnKeyUpEvent != null || OnKeyPressEvent != null)) { Win32Api.KeyboardHookStruct KeyDataFromHook = (Win32Api.KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32Api.KeyboardHookStruct)); Keys keyData = (Keys)KeyDataFromHook.vkCode; //按下控制键 if ((OnKeyDownEvent != null || OnKeyPressEvent != null) && (wParam == Win32Api.WM_KEYDOWN || wParam == Win32Api.WM_SYSKEYDOWN)) { if (IsCtrlAltShiftKeys(keyData) && preKeysList.IndexOf(keyData) == -1) { preKeysList.Add(keyData); } } //WM_KEYDOWN和WM_SYSKEYDOWN消息,将会引发OnKeyDownEvent事件 if (OnKeyDownEvent != null && (wParam == Win32Api.WM_KEYDOWN || wParam == Win32Api.WM_SYSKEYDOWN)) { KeyEventArgs e = new KeyEventArgs(GetDownKeys(keyData)); OnKeyDownEvent(this, e); } //WM_KEYDOWN消息将引发OnKeyPressEvent if (OnKeyPressEvent != null && wParam == Win32Api.WM_KEYDOWN) { byte[] keyState = new byte[256]; Win32Api.GetKeyboardState(keyState); byte[] inBuffer = new byte[2]; if (Win32Api.ToAscii(KeyDataFromHook.vkCode, KeyDataFromHook.scanCode, keyState, inBuffer, KeyDataFromHook.flags) == 1) { KeyPressEventArgs e = new KeyPressEventArgs((char)inBuffer[0]); OnKeyPressEvent(this, e); } } //松开控制键 if ((OnKeyDownEvent != null || OnKeyPressEvent != null) && (wParam == Win32Api.WM_KEYUP || wParam == Win32Api.WM_SYSKEYUP)) { if (IsCtrlAltShiftKeys(keyData)) { for (int i = preKeysList.Count - 1; i >= 0; i--) { if (preKeysList[i] == keyData) { preKeysList.RemoveAt(i); } } } } //WM_KEYUP和WM_SYSKEYUP消息,将引发OnKeyUpEvent事件 if (OnKeyUpEvent != null && (wParam == Win32Api.WM_KEYUP || wParam == Win32Api.WM_SYSKEYUP)) { KeyEventArgs e = new KeyEventArgs(GetDownKeys(keyData)); OnKeyUpEvent(this, e); } } return(Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam)); }
/// <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) { // 如果该消息被丢弃(nCode<0 if (nCode >= 0) { Win32Api.KeyboardHookStruct KeyDataFromHook = (Win32Api.KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32Api.KeyboardHookStruct)); int keyData = KeyDataFromHook.vkCode; //WM_KEYDOWN和WM_SYSKEYDOWN消息,将会引发OnKeyDownEvent事件 if (OnKeyDownEvent != null && (wParam == Win32Api.WM_KEYDOWN || wParam == Win32Api.WM_SYSKEYDOWN)) { // 此处触发键盘按下事件 // keyData为按下键盘的值,对应 虚拟码 OnKeyDownEvent(this, new KeyDownEvent() { KeyData = keyData }); } //WM_KEYUP和WM_SYSKEYUP消息,将引发OnKeyUpEvent事件 if (OnKeyUpEvent != null && (wParam == Win32Api.WM_KEYUP || wParam == Win32Api.WM_SYSKEYUP)) { // 此处触发键盘抬起事件 OnKeyUpEvent(this, new OnKeyUpEvent() { KeyData = keyData }); } if (KeyDataFromHook.vkCode == 91)//截获左边WIN键 { return(1); } if (KeyDataFromHook.vkCode == 92)//截获右边WIN键 { return(1); } if (KeyDataFromHook.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Control)//截获Ctrl+ESC键 { return(1); } if (KeyDataFromHook.vkCode == (int)Keys.F4 && (int)Control.ModifierKeys == (int)Keys.Alt)//截获ALT+F4 { return(1); } if (KeyDataFromHook.vkCode == (int)Keys.Tab && (int)Control.ModifierKeys == (int)Keys.Alt)//截获ALT+TAB { return(1); } } return(Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam)); }
private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam) { Win32Api.KeyboardHookStruct msg = (Win32Api.KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32Api.KeyboardHookStruct)); if (nCode >= 0) { if (Win32Api.WM_KEYDOWN == wParam) { if (65 == msg.vkCode) { return(1); } } else { return(0); } } return(CallNextHookEx(hKeyboardHook, nCode, wParam, lParam)); }