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); } }
protected void KeyEvent(KeyCode Key) { if ((NativeMethods.GetAsyncKeyState(Key) & 0x1) != 0) { KeyDown?.Invoke(this); } if ((NativeMethods.GetAsyncKeyState(Key) & 0x8000) != 0) { KeyHold?.Invoke(this); } }
public override void Update(GameTime gameTime) { base.Update(gameTime); if (!Enabled) { return; } var state = Keyboard.GetState(); var oldPressed = _previousState.GetPressedKeys(); var newPressed = state.GetPressedKeys(); for (var i = 0; i < oldPressed.Length; ++i) { if (Array.IndexOf(newPressed, oldPressed[i]) < 0) { var e = new KeyEventArgs(oldPressed[i], KeyState.Down, KeyState.Up); KeyUp?.Invoke(this, e); } } for (var i = 0; i < newPressed.Length; ++i) { if (Array.IndexOf(oldPressed, newPressed[i]) < 0) { var e = new KeyEventArgs(newPressed[i], KeyState.Up, KeyState.Down); KeyDown?.Invoke(this, e); } else { var e = new KeyEventArgs(newPressed[i], KeyState.Down, KeyState.Down); KeyHold?.Invoke(this, e); } } _previousState = state; }