// Asynch Call from the GlobalKbdHook private void _kbdHook_KeyboardPressed(object sender, GlobalKbdHookEventArgs e) { if (!_kbdAction) { return; // not allowed at this time... } // maintain the currently held down modifiers if (e.KeyDown) { // pressed _modifiers |= (e.KeyboardData.VirtualCode == (int)Keys.LMenu) ? KeyModifier.LAlt : KeyModifier.None; _modifiers |= (e.KeyboardData.VirtualCode == (int)Keys.RMenu) ? KeyModifier.RAlt : KeyModifier.None; _modifiers |= (e.KeyboardData.VirtualCode == (int)Keys.LControlKey) ? KeyModifier.LCtrl : KeyModifier.None; _modifiers |= (e.KeyboardData.VirtualCode == (int)Keys.RControlKey) ? KeyModifier.RCtrl : KeyModifier.None; _modifiers |= (e.KeyboardData.VirtualCode == (int)Keys.LShiftKey) ? KeyModifier.LShift : KeyModifier.None; _modifiers |= (e.KeyboardData.VirtualCode == (int)Keys.RShiftKey) ? KeyModifier.RShift : KeyModifier.None; } else { // released _modifiers &= (e.KeyboardData.VirtualCode == (int)Keys.LMenu) ? ~KeyModifier.LAlt : ~KeyModifier.None; _modifiers &= (e.KeyboardData.VirtualCode == (int)Keys.RMenu) ? ~KeyModifier.RAlt : ~KeyModifier.None; _modifiers &= (e.KeyboardData.VirtualCode == (int)Keys.LControlKey) ? ~KeyModifier.LCtrl : ~KeyModifier.None; _modifiers &= (e.KeyboardData.VirtualCode == (int)Keys.RControlKey) ? ~KeyModifier.RCtrl : ~KeyModifier.None; _modifiers &= (e.KeyboardData.VirtualCode == (int)Keys.LShiftKey) ? ~KeyModifier.LShift : ~KeyModifier.None; _modifiers &= (e.KeyboardData.VirtualCode == (int)Keys.RShiftKey) ? ~KeyModifier.RShift : ~KeyModifier.None; } //Console.WriteLine( $"{e.KeyDown,6} {e.KeyboardData.VirtualCode} {(Keys)e.KeyboardData.VirtualCode} {e.KeyboardData.Flags} {e.KeyboardData.AdditionalInformation}" ); if (e.KeyDown) { // proc keys only if enabled for (int i = 0; i < _cat.Count; i++) { var hi = _cat.ElementAt(i); hi.Value.TestAndCall(e.KeyboardData.VirtualCode, _modifiers); // will exec if the key and mod matches } // Eat Input if true, else it will go to all other subscribers too //e.Handled = true; } }
// called by WIN on Keys public 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; KeyboardState kbdState = (KeyboardState)wparamTyped; bool kDown = kbdState == KeyboardState.KeyDown || kbdState == KeyboardState.SysKeyDown; var eventArguments = new GlobalKbdHookEventArgs(p, kbdState, kDown); EventHandler <GlobalKbdHookEventArgs> handler = KeyboardPressed; handler?.Invoke(this, eventArguments); fEatKeyStroke = eventArguments.Handled; } // propagates or closes the event (based on Handled) return(fEatKeyStroke ? (IntPtr)1 : CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam)); }