Esempio n. 1
0
        // 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;
            }
        }
Esempio n. 2
0
        // 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));
        }