public SpecialKeyState CheckModifiers() { SpecialKeyState state = new SpecialKeyState(); if ((InterceptKeys.GetKeyState(VK_SHIFT) & 0x8000) != 0) { //SHIFT is pressed state.ShiftPressed = true; } if ((InterceptKeys.GetKeyState(VK_CONTROL) & 0x8000) != 0) { //CONTROL is pressed state.CtrlPressed = true; } if ((InterceptKeys.GetKeyState(VK_ALT) & 0x8000) != 0) { //ALT is pressed state.AltPressed = true; } if ((InterceptKeys.GetKeyState(VK_WIN) & 0x8000) != 0) { //WIN is pressed state.WinPressed = true; } return(state); }
private GlobalHotkey() { // We have to store the LowLevelKeyboardProc, so that it is not garbage collected runtime hookedLowLevelKeyboardProc = LowLevelKeyboardProc; // Set the hook hookId = InterceptKeys.SetHook(hookedLowLevelKeyboardProc); }
private bool ModifierKeyPressed(Key key) { const int keyPressed = 0x8000; var pressed = Convert.ToBoolean(InterceptKeys.GetKeyState(key) & keyPressed); return(pressed); }
private IntPtr LowLevelKeyboardProc(int nCode, UIntPtr wParam, IntPtr lParam) { bool continues = true; if (nCode >= 0) { if (wParam.ToUInt32() == (int)KeyEvent.WM_KEYDOWN || wParam.ToUInt32() == (int)KeyEvent.WM_KEYUP || wParam.ToUInt32() == (int)KeyEvent.WM_SYSKEYDOWN || wParam.ToUInt32() == (int)KeyEvent.WM_SYSKEYUP) { if (hookedKeyboardCallback != null) { continues = hookedKeyboardCallback((KeyEvent)wParam.ToUInt32(), Marshal.ReadInt32(lParam), CheckModifiers()); } } } if (continues) { return(InterceptKeys.CallNextHookEx(hookId, nCode, wParam, lParam)); } return((IntPtr)1); }
public void Dispose() { InterceptKeys.UnhookWindowsHookEx(hookId); }
private IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam) { const int pressed = 0; // HC_ACTION IntPtr intercepted = (IntPtr)1; if (nCode == pressed) { var m = (WindowsMessage)wParam.ToInt32(); var info = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT)); if (m == WindowsMessage.KEYDOWN || m == WindowsMessage.SYSKEYDOWN) { var pressedHotkey = new HotkeyModel(info.vkCode); if (pressedHotkey.Key != Key.None && pressedHotkey.ModifierKeys.Length != 0) { if (!Capturing) { if (_hotkeys.ContainsKey(pressedHotkey)) { _modifierPressed = true; var action = _hotkeys[pressedHotkey]; action(); return(intercepted); } else { return(InterceptKeys.CallNextHookEx(_hookID, nCode, wParam, lParam)); } } else if (HotkeyCaptured != null) { _modifierPressed = true; var args = new HotkeyCapturedEventArgs { Hotkey = pressedHotkey, Available = !_hotkeys.ContainsKey(pressedHotkey), }; HotkeyCaptured.Invoke(this, args); return(intercepted); } else { return(InterceptKeys.CallNextHookEx(_hookID, nCode, wParam, lParam)); } } else { return(InterceptKeys.CallNextHookEx(_hookID, nCode, wParam, lParam)); } } else if (m == WindowsMessage.KEYUP) { // if win+r is pressed, windows star menu will still popup // so we need to discard keyup event if (_modifierPressed) { _modifierPressed = false; if (info.vkCode == Key.LWIN || info.vkCode == Key.RWIN || info.vkCode == Key.WIN) { return(intercepted); } else { return(InterceptKeys.CallNextHookEx(_hookID, nCode, wParam, lParam)); } } else { return(InterceptKeys.CallNextHookEx(_hookID, nCode, wParam, lParam)); } } else { return(InterceptKeys.CallNextHookEx(_hookID, nCode, wParam, lParam)); } } else { return(InterceptKeys.CallNextHookEx(_hookID, nCode, wParam, lParam)); } }
private GlobalHotkey() { _hotkeys = new Dictionary <HotkeyModel, Action>(); _hookID = InterceptKeys.SetHook(LowLevelKeyboardProc); }