private static void KeyboardHookHandler(object data) { if (allHotkeysSuspendCount > 0) { return; } lock (keysLocker) { KeyboardHookData hookData = (KeyboardHookData)data; KeyboardMessageType keyState = hookData.keyState; KBDLLHOOKSTRUCT keyboardData = hookData.keyData; Keys newKeys = (Keys)keyboardData.vkCode; Keys newModifierKeys = HotkeyUtils.GetModifierKeys(newKeys); if (keyState == KeyboardMessageType.WM_KEYDOWN || keyState == KeyboardMessageType.WM_SYSKEYDOWN) { pressedModifierKeys |= newModifierKeys; if (newKeys != pressedKey) { pressedKey = newKeys; HandleHotkeys(newModifierKeys == Keys.None ? pressedKey : Keys.None); } } else if (keyState == KeyboardMessageType.WM_KEYUP || keyState == KeyboardMessageType.WM_SYSKEYUP) { pressedKey = Keys.None; pressedModifierKeys &= ~newModifierKeys; } } }
private void KeyP(int wParam, KeyboardHookData lParam) { if (kh.WinHeld && kh.CtrlHeld) { if (kh.AltHeld && lParam.vkCode != 115) // Alt, but not F4 { if (lParam.vkCode == 121) // F10 { RunPsx(); } else if (lParam.vkCode == 120) // F9 { WinRun(); } else if (lParam.vkCode == 119) // F8 { OperaPrivate(); } } else if (lParam.vkCode > 48 && lParam.vkCode <= 52 && this.acceptWorkspace.Contains(lParam.vkCode - 49)) { // 1-4 MoveToWorkspace(lParam.vkCode - 49); } else if (lParam.vkCode == 48) // 0 { RunPsx(-2); } else if (lParam.vkCode == 56) // 8 { RunPsx(0); } else if (lParam.vkCode > 53 && lParam.vkCode < 58) // 6-9 { RunPsx(lParam.vkCode - 60); } else if (lParam.vkCode >= 122 && lParam.vkCode <= 123) // F11-F12 { RunPsx(lParam.vkCode - 123); } else if (lParam.vkCode >= 112 && lParam.vkCode <= 123) // F1-F12 { ChangeBackground(lParam.vkCode - 111); } else if (lParam.vkCode == 37 && this.acceptWorkspace.Contains(this.idCurrentWorkspace - 1)) { // Left this.idCurrentWorkspace--; SetTrayIconN(this.idCurrentWorkspace); } else if (lParam.vkCode == 39 && this.acceptWorkspace.Contains(this.idCurrentWorkspace + 1)) { // Right this.idCurrentWorkspace++; SetTrayIconN(this.idCurrentWorkspace); } } }
/// <summary> /// Private hook that checks the return code /// and calls the overridden hook process <paramref name="hookProc"/> /// </summary> /// <param name="code">A code the hook procedure uses to determine /// how to process the message.</param> /// <param name="wParam">The virtual-key code of the key that generated /// the keystroke message.</param> /// <param name="lParam">The repeat count, scan code, extended-key flag, /// context code, previous key-state flag,</param> /// <see cref="https://msdn.microsoft.com/en-us/library/windows/desktop/ms644984%28v=vs.85%29.aspx"/> /// <returns></returns> private int _hookProc(int code, int wParam, ref KeyboardHookData lParam) { if (code >= 0) { //Pass on for other objects to process. return(this.hookProc(code, wParam, ref lParam)); } else { return(CallNextHookEx(hhook, code, wParam, ref lParam)); } }
/// <summary> /// Overridable function called by the hooked procedure /// function <typeparamref name="_hookProc"/>. /// </summary> /// <param name="code">A code the hook procedure uses to determine /// how to process the message.</param> /// <param name="wParam">The virtual-key code of the key that generated /// the keystroke message.</param> /// <param name="lParam">The repeat count, scan code, extended-key flag, /// context code, previous key-state flag,</param> /// <see cref="https://msdn.microsoft.com/en-us/library/windows/desktop/ms644984%28v=vs.85%29.aspx"/> /// <returns></returns> public virtual int hookProc( int code, int wParam, ref KeyboardHookData lParam) { Keys k = (Keys)lParam.vkCode; // Check for shift(s), alt, and ctrl. // Shift if (k == Keys.LShiftKey) { bLeftShiftHeld = bShiftHeld = (wParam == WM_KEYDOWN); } else if (k == Keys.RShiftKey) { bRightShiftHeld = bShiftHeld = (wParam == WM_KEYDOWN); } // Control if ((lParam.vkCode & 0xA2) == 0xA2 || (lParam.vkCode & 0xA3) == 0xA3) { bCtrlHeld = (wParam == WM_KEYDOWN); //return 1; } // 164 mean ALT, 165 mean ALT+GR if (lParam.vkCode == 164) { bAltHeld = (wParam == WM_SYSKEYDOWN); //return 1; } //Key Press Event KeyEventArgs kea = new KeyEventArgs(k); bool handled = false; if ((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) && (KeyDown != null)) { handled = KeyDown(wParam, lParam); } else if ((wParam == WM_KEYUP || wParam == WM_SYSKEYUP) && (KeyUp != null)) { handled = KeyUp(wParam, lParam); } if ((kea.Handled) || (handled)) { return(1); } return(CallNextHookEx(hhook, code, wParam, ref lParam)); }
private bool Kh_KeyDown(int wParam, KeyboardHookData lParam) { bool keyHandled = false; Keys keyData = (Keys)lParam.vkCode; // Testing alt+x key pressed if (kh.AltHeld) { int screenNumKey = -1; if (keyData == Keys.D0) { keyHandled = true; int nbOfActiveScreen = numberOfActiveBlackScreen(CommonData.dataInstance.BlackWindows); // Showing all black screens if number of screens actually shows is less than half of existing screens if (nbOfActiveScreen <= ((Double)CommonData.dataInstance.BlackWindows.Length / 2)) { showAllBlackWindows(CommonData.dataInstance.BlackWindows); } else // Hide all screens if (nbOfActiveScreen > (CommonData.dataInstance.BlackWindows.Length / 2)) { hideAllBlackWindows(CommonData.dataInstance.BlackWindows); } } else if (keyData == Keys.D1) { screenNumKey = 1; keyHandled = true; } else if ((keyData == Keys.D2) && (Screen.AllScreens.Length > 1)) { screenNumKey = 2; keyHandled = true; } else if (keyData == Keys.D3 && (Screen.AllScreens.Length > 2)) { screenNumKey = 3; keyHandled = true; } else if (keyData == Keys.D4 && (Screen.AllScreens.Length > 3)) { screenNumKey = 4; keyHandled = true; } else if (keyData == Keys.D5 && (Screen.AllScreens.Length > 4)) { screenNumKey = 5; keyHandled = true; } else if (keyData == Keys.D6 && (Screen.AllScreens.Length > 5)) { screenNumKey = 6; keyHandled = true; } // If any valide alt+X key, and screen associated if ((screenNumKey > 0) && (screenNumKey <= Screen.AllScreens.Length)) { if (CommonData.dataInstance.BlackWindows[screenNumKey - 1] == null) { // Creating first time BlackWindows for this screen CommonData.dataInstance.BlackWindows[screenNumKey - 1] = initNewBlackWindow(screenNumKey); } BlackWindow currentBlackWindow = CommonData.dataInstance.BlackWindows[screenNumKey - 1]; if (currentBlackWindow.IsVisible) { // Hidding black screen window if already visible hideBlackWindow(currentBlackWindow); } else { // Showing Blackscreen window if not visible showBlackWindow(currentBlackWindow, Screen.AllScreens[screenNumKey - 1], screenNumKey); } } } // If keyHandled == true, current keypressed will not be handled anymore by Windows // (in certain cases, let it continue to be handled by Microsoft Windows launch Windows system beep sound each time alt+x key was pressed...) return(keyHandled); }
static extern int CallNextHookEx(IntPtr idHook, int nCode, int wParam, ref KeyboardHookData lParam);