private IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam) { bool fEatKeyStroke = false; var wparamTyped = wParam.ToInt32(); if (Enum.IsDefined(typeof(KeyboardState), wparamTyped)) { object o = Marshal.PtrToStructure(lParam, typeof(LowLevelKeyboardInputEvent)); LowLevelKeyboardInputEvent p = (LowLevelKeyboardInputEvent)o; var eventArguments = new GlobalKeyboardHookEventArgs(p, (KeyboardState)wparamTyped); EventHandler <GlobalKeyboardHookEventArgs> handler = KeyboardPressed; handler?.Invoke(this, eventArguments); fEatKeyStroke = eventArguments.Handled; } return(fEatKeyStroke ? (IntPtr)1 : CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam)); }
private void Hook_KeyboardPressed(object sender, GlobalKeyboardHookEventArgs e) { var currentlyPressedKeys = new List <string>(); var virtualCode = e.KeyboardData.VirtualCode; // ESC pressed if (virtualCode == KeyInterop.VirtualKeyFromKey(Key.Escape)) { if (_appStateHandler.IsColorPickerEditorVisible()) { _appStateHandler.HideColorPickerEditor(); } else { _appStateHandler.HideColorPicker(); PowerToysTelemetry.Log.WriteEvent(new ColorPickerCancelledEvent()); } return; } var name = Helper.GetKeyName((uint)virtualCode); // If the last key pressed is a modifier key, then currentlyPressedKeys cannot possibly match with _activationKeys // because _activationKeys contains exactly 1 non-modifier key. Hence, there's no need to check if `name` is a // modifier key or to do any additional processing on it. if (e.KeyboardState == GlobalKeyboardHook.KeyboardState.KeyDown || e.KeyboardState == GlobalKeyboardHook.KeyboardState.SysKeyDown) { // Check pressed modifier keys. AddModifierKeys(currentlyPressedKeys); currentlyPressedKeys.Add(name); } currentlyPressedKeys.Sort(); if (currentlyPressedKeys.Count == 0 && _previouslyPressedKeys.Count != 0) { // no keys pressed, we can enable activation shortcut again _activationShortcutPressed = false; } _previouslyPressedKeys = currentlyPressedKeys; if (ArraysAreSame(currentlyPressedKeys, _activationKeys)) { // avoid triggering this action multiple times as this will be called nonstop while keys are pressed if (!_activationShortcutPressed) { _activationShortcutPressed = true; if (_userSettings.ActivationAction.Value == ColorPickerActivationAction.OpenEditor) { _appStateHandler.ShowColorPickerEditor(); } else { _appStateHandler.ShowColorPicker(); } } } }