private IntPtr KeyHookProc(int nCode, IntPtr wParam, IntPtr lParam) { Hook.KBDLLHOOKSTRUCT hs = (Hook.KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(Hook.KBDLLHOOKSTRUCT)); Message.WindowsMessage wm = (Message.WindowsMessage)wParam; if (nCode >= 0 && (_key == 0 || _key == hs.vkCode)) { Keyboard.VirtualKeyStates key = (Keyboard.VirtualKeyStates)hs.vkCode; Keyboard.ScanCodes scanCode = (Keyboard.ScanCodes)hs.scanCode; KeyboardState.KeyStatus status; switch (wm) { case Message.WindowsMessage.KEYDOWN: case Message.WindowsMessage.SYSKEYDOWN: status = KeyboardState.KeyStatus.Down; break; case Message.WindowsMessage.KEYUP: case Message.WindowsMessage.SYSKEYUP: status = KeyboardState.KeyStatus.Up; break; default: status = KeyboardState.KeyStatus.None; break; } TimeSpan time = TimeSpan.FromMilliseconds(hs.time); KeyboardState ks = KeyboardState.CreateCurrent(key, scanCode, status, time); switch (ks.Status) { case KeyboardState.KeyStatus.Down: KeyAny?.Invoke(this, ks); KeyPress?.Invoke(this, ks); KeyDown?.Invoke(this, ks); break; case KeyboardState.KeyStatus.Hold: KeyAny?.Invoke(this, ks); KeyPress?.Invoke(this, ks); KeyHold?.Invoke(this, ks); break; case KeyboardState.KeyStatus.Up: KeyAny?.Invoke(this, ks); KeyUp?.Invoke(this, ks); break; default: KeyAny?.Invoke(this, ks); break; } if (CallNextHook is null || CallNextHook(this, ks)) { return(Hook.CallNextHookEx(_kHHook, nCode, wParam, lParam)); } else { return(_kHHook); } }
public KeyboardState( Keyboard.VirtualKeyStates key = Keyboard.VirtualKeyStates.None, Keyboard.ScanCodes scanCode = Keyboard.ScanCodes.None, KeyStatus status = KeyStatus.None, KeyModifiers modifiers = KeyModifiers.None, TimeSpan time = new TimeSpan()) { _Key = key; _ScanCode = scanCode; _Status = status; _Modifiers = modifiers; _Time = time; }
public static IntPtr GetLParam(Keyboard.ScanCodes scanCode) { return((IntPtr)(((int)scanCode << 16) | 1)); }
public virtual void Up(Keyboard.VirtualKeyStates virtualKey, Keyboard.ScanCodes scanCode) { scanCode = GetClearScanCode(scanCode) | Keyboard.ScanCodes.Pressed | Keyboard.ScanCodes.Transition; Message.PostMessage(WindowHandle, Message.WindowsMessage.KEYUP, (IntPtr)virtualKey, GetLParam(scanCode)); }
public static Keyboard.ScanCodes GetClearScanCode(Keyboard.ScanCodes scanCode) { return(scanCode & (Keyboard.ScanCodes.ScanCode | Keyboard.ScanCodes.Extended | Keyboard.ScanCodes.Context)); }
public virtual void Hold(Keyboard.VirtualKeyStates virtualKey, Keyboard.ScanCodes scanCode) { scanCode = GetClearScanCode(scanCode) | Keyboard.ScanCodes.Pressed; Message.PostMessage(WindowHandle, Message.WindowsMessage.KEYDOWN, (IntPtr)virtualKey, GetLParam(scanCode)); }
public override void Down(Keyboard.VirtualKeyStates virtualKey, Keyboard.ScanCodes scanCode) { scanCode = GetClearScanCode(scanCode); Message.PostMessage(WindowHandle, Message.WindowsMessage.SYSKEYDOWN, (IntPtr)virtualKey, GetLParam(scanCode)); }