private void KeyboardHook_KeyDown(object sender, KeyEventArgs args)
        {
            //Console.WriteLine($"DOWN control: {args.Control} alt: {args.Alt} shift: {args.Shift} keycode: {args.KeyCode} keydata: {args.KeyData} modifiers: {args.Modifiers} suppressKeyPress: {args.SuppressKeyPress}");

            if (pressedHotkey != null)
            {
                return;
            }

            Func <bool> doesRegisteredHotkeysHaveAny = () => {
                return(registeredHotkeys.Any(x => {
                    var keyArgs = x.Value.KeyEventArgs;

                    //if (Enum.TryParse(Enum.GetName(typeof(EKeyboardModifier), keyArgs.Modifier), out Keys modifier)) {
                    if ((ushort)args.KeyData == (ushort)keyArgs.KeyCode && (int)args.Modifiers == /*modifier*/ (int)keyArgs.Modifiers)
                    {
                        pressedHotkey = x.Value;
                        return true;
                    }
                    //}
                    //
                    return false;
                }));
            };

            if (doesRegisteredHotkeysHaveAny())
            {
                pressedHotkey.Invoke(EHotkeyState.Down);
                keyboardHook.KeyDown -= KeyboardHook_KeyDown;
                keyboardHook.KeyUp   += KeyboardHook_KeyUp;
            }
        }
 public KeyboardHookManager(System.Reflection.Assembly executingAssembly)
 {
     keyboardHook          = new KeyboardHook(executingAssembly);
     keyboardHook.KeyDown += KeyboardHook_KeyDown;
     registeredHotkeys     = new Dictionary <int, TParentHotkeyInvoker>();
     pressedHotkey         = null;
 }
            public static TParentHotkeyInvoker Create(int id, TKeyEventArgs keyEventArgs, Action <TChildHotkey> unregister)
            {
                var hotkeyInvoker = new TParentHotkeyInvoker(id, keyEventArgs, out Action <EHotkeyState> invokeHotkey, unregister);

                hotkeyInvoker.Invoke = invokeHotkey;
                return(hotkeyInvoker);
            }
        private void releaseKeyDown()
        {
            var _pressedHotkey = pressedHotkey;

            pressedHotkey = null;
            _pressedHotkey.Invoke(EHotkeyState.Up);
            keyboardHook.KeyUp   -= KeyboardHook_KeyUp;
            keyboardHook.KeyDown += KeyboardHook_KeyDown;
        }
        /// <summary>
        /// Registers a hotkey. To register only a modifier: set it as <see cref="TKeyEventArgs.KeyCode"/>.
        /// </summary>
        /// <param name="args"></param>
        /// <returns>Hotkey id. You have to unregister it.</returns>
        public TChildHotkey RegisterHotkey(TKeyEventArgs args)
        {
            TParentHotkeyInvoker hotkeyInvoker = null;

            if (!registeredHotkeys.Any((x) => {
                if (x.Value.KeyEventArgs.Modifiers == args.Modifiers && x.Value.KeyEventArgs.KeyCode == args.KeyCode)
                {
                    hotkeyInvoker = x.Value;
                    return(true);
                }
                //
                return(false);
            }))
            {
                if (registeredHotkeys.Count == 0)
                {
                    start();
                }

                int id = 0;

                do
                {
                    id++;
                } while (registeredHotkeys.Any(x => x.Value.Id == id));

                hotkeyInvoker = TParentHotkeyInvoker.Create(id, args, (childHotkey) => UnregisterHotkey(id));
                registeredHotkeys.Add(id, hotkeyInvoker);
                return(hotkeyInvoker.RegisterChildren());
            }
            else
            {
                hotkeyInvoker.Counter++;
                return(hotkeyInvoker.RegisterChildren());
            }
        }