private void KeyboardHook_OnKeyboardEvent(KeyState state, VirtualKeyCode key)
        {
            if (OnKeyboardEvent != null)
            {
                Task.Factory.StartNew(() =>
                {
                    OnKeyboardEvent?.Invoke(state, key);
                });
            }

            if (mapKeyState.ContainsKey(key))
            {
                mapKeyState[key] = state == KeyState.Up && mapKeyState[key] == KeyState.Down
                    ? KeyState.Pressed
                    : state;
            }

            Task.Factory.StartNew(() =>
            {
                var currentKeyCallbackDict = singleKeyCallback; // create a temp var to avoid locking

                if (currentKeyCallbackDict != null && currentKeyCallbackDict.Count != 0)
                {
                    if (currentKeyCallbackDict.ContainsKey(key))
                    {
                        var currentList = currentKeyCallbackDict[key];

                        foreach (var callback in currentList)
                        {
                            callback(state, key);
                        }
                    }
                }
            });
        }
 private void InvokeEventListeners(KeyState state, VirtualKeyCode key)
 {
     Task.Factory.StartNew(() =>
     {
         OnKeyboardEvent?.Invoke(state, key);
     });
 }
        private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
        {
            Boolean IsDown = wParam == (IntPtr)EWindowsMessage.KEYDOWN || wParam == (IntPtr)EWindowsMessage.SYSKEYDOWN;
            int     vkCode = Marshal.ReadInt32(lParam);

            OnKeyboardEvent?.Invoke(vkCode, IsDown);

            return(CallNextHookEx(HookID, nCode, wParam, lParam));
        }