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 static IntPtr KeyboardHook(int code, IntPtr wParam, IntPtr lParam) { KeyboardMessageType keyState = (KeyboardMessageType)wParam; if (code >= 0 && (keyState == KeyboardMessageType.WM_KEYDOWN || keyState == KeyboardMessageType.WM_KEYUP || keyState == KeyboardMessageType.WM_SYSKEYDOWN || keyState == KeyboardMessageType.WM_SYSKEYUP)) { ThreadPool.QueueUserWorkItem( KeyboardHookHandler, new KeyboardHookData(keyState, Marshal.PtrToStructure <KBDLLHOOKSTRUCT>(lParam))); } return(CallNextHookEx(keyboardHook, code, wParam, lParam)); }
public KeyboardHookData(KeyboardMessageType keyState, KBDLLHOOKSTRUCT keyData) { this.keyState = keyState; this.keyData = keyData; }