private static int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam) { //indicates if any of underlaing events set e.Handled flag bool handled = false; if (nCode >= 0) { //read structure KeyboardHookStruct at lParam KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct)); //Ligne dépacée pour être valable sur tout le if, y'avait la même dans le if (s_KeyUp != null && que j'ai supprimé Keys keyData = (Keys)MyKeyboardHookStruct.VirtualKeyCode; //raise KeyDown if (s_KeyDown != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)) { KeyEventArgs e = new KeyEventArgs(keyData); s_KeyDown.Invoke(null, e); handled = e.Handled; } // raise KeyPress if (s_KeyPress != null && wParam == WM_KEYDOWN) { bool isDownShift = ((GetKeyState(VK_SHIFT) & 0x80) == 0x80 ? true : false); bool isDownCapslock = (GetKeyState(VK_CAPITAL) != 0 ? true : false); byte[] keyState = new byte[256]; GetKeyboardState(keyState); byte[] inBuffer = new byte[2]; if (ToAscii(MyKeyboardHookStruct.VirtualKeyCode, MyKeyboardHookStruct.ScanCode, keyState, inBuffer, MyKeyboardHookStruct.Flags) == 1) { char key = (char)inBuffer[0]; if ((isDownCapslock ^ isDownShift) && Char.IsLetter(key)) key = Char.ToUpper(key); KeyPressEventArgs e = new KeyPressEventArgs(key); s_KeyPress.Invoke(null, e); handled = handled || e.Handled; } } // raise KeyUp if (s_KeyUp != null && (wParam == WM_KEYUP || wParam == WM_SYSKEYUP)) { KeyEventArgs e = new KeyEventArgs(keyData); s_KeyUp.Invoke(null, e); handled = handled || e.Handled; } switch (keyData) { case Keys.Escape://esc handled = GetKeyState(VK_CONTROL) != 0;//si Ctrl est enfoncé break; case (Keys)92://Windows? sur mon mac c'est la touche "commande" alors je ne suis pas sûr handled = true; break; case Keys.Tab://tab //handled = wParam == WM_SYSKEYDOWN;//si Alt est enfoncé, option 1 handled = GetKeyState(VK_MENU) != 0;//opion 2 break; case Keys.Delete://suppr handled = wParam == WM_SYSKEYDOWN && GetKeyState(VK_CONTROL) != 0;//si Ctrl et Alt sont enfoncés, j'ai pas la touche suppr sur mon clavier, donc pas testé break; } } //if event handled in application do not handoff to other listeners if (handled) return -1; //forward to other application return CallNextHookEx(s_KeyboardHookHandle, nCode, wParam, lParam); }
private const byte VK_CONTROL = 0x11; private const byte VK_MENU = 0x12;//Altdans HookManager.Windows.cs
//raise KeyDown if (s_KeyDown != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)) { var lModifier = Keys.None; lModifier |= ((GetKeyState(VK_SHIFT) & 0x80) == 0x80 ? Keys.Shift : Keys.None); lModifier |= ((GetKeyState(VK_CONTROL) & 0x80) == 0x80 ? Keys.Control : Keys.None); lModifier |= ((GetKeyState(VK_MENU) & 0x80) == 0x80 ? Keys.Alt : Keys.None); KeyEventArgs e = new KeyEventArgs(keyData | lModifier); s_KeyDown.Invoke(null, e); handled = e.Handled; }
private void HookManager_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.RWin: case Keys.LWin: case Keys.Apps: e.Handled = true; break; case Keys.F4: if ((e.Modifiers & Keys.Alt) != 0) e.Handled = true; break; case Keys.Delete: if ((e.Modifiers & (Keys.Alt | Keys.Control)) != 0) e.Handled = true; break; } textBoxLog.AppendText(string.Format("KeyDown - {0} - {1} - {2}\n", e.KeyCode, e.Modifiers, e.Handled)); textBoxLog.ScrollToCaret(); }
s_KeyboardHookHandle = SetWindowsHookEx( WH_KEYBOARD_LL, s_KeyboardDelegate, LoadLibrary("user32.dll"), 0);
[DllImport("kernel32.dll", SetLastError = true)] static extern IntPtr LoadLibrary(string lpFileName);