private static void DumpState(LowLevelKeyboardProcEventArgs e)
        {
            if (e.ControlKeyState()) Console.Write("Control-");
            if (e.ShiftKeyState) Console.Write("Shift-");
            if (e.AltKeyState) Console.Write("Alt-");
            if (e.WindowsKeyState) Console.Write("Windows-");
            if (e.MenuKeyState) Console.Write("Menu-");

            if (!e.IsModifier)
            {
                Console.Write($"{(Keys)e.KeyCode}");
            }
            Console.WriteLine(e.KeyUp() ? " released" : " pressed");
        }
 private static void InterceptKeys_KeyUp(object sender, LowLevelKeyboardProcEventArgs e)
 {
     DumpState(e);
 }
        private IntPtr LowLevelKeyPressHandler(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if (nCode < 0 ) return CallNextHookEx(_hookId, nCode, wParam, lParam);

            var keyData = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));

            var keyDown = keyData.KeyDown();
            _keyStates[(Keys)keyData.vkCode] = keyDown;
            var evt = new LowLevelKeyboardProcEventArgs(keyData.vkCode, keyData.scanCode, keyData.flags, _keyStates);

            if (keyDown)
            {
                if (CheckHotKeys()) nCode = -1; // We've used this hotkey so stop it propagating any further

                KeyDown?.Invoke(null, evt);
            }
            else KeyUp?.Invoke(null, evt);

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