public IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam) { bool fEatKeyStroke = false; var wparamTyped = wParam.ToInt32(); if (Enum.IsDefined(typeof(Native.KeyboardState), wparamTyped)) { object o = Marshal.PtrToStructure(lParam, typeof(LowLevelKeyboardInputEvent)); LowLevelKeyboardInputEvent p = (LowLevelKeyboardInputEvent)o; var eventArguments = new KeyboardHookEventArgs(p, (Native.KeyboardState)wparamTyped); var scancode = eventArguments.KeyboardData.HardwareScanCode; var vkey = (VirtualKeys)eventArguments.KeyboardData.VirtualCode; var flags = eventArguments.KeyboardData.Flags; var extended = ((flags) & ((int)KeyFlags.KF_EXTENDED >> 8)) > 0; var altdown = ((flags) & ((int)KeyFlags.KF_ALTDOWN >> 8)) > 0; var dlgmode = ((flags) & ((int)KeyFlags.KF_DLGMODE >> 8)) > 0; var menumode = ((flags) & ((int)KeyFlags.KF_MENUMODE >> 8)) > 0; var repeat = ((flags) & ((int)KeyFlags.KF_REPEAT >> 8)) > 0; var up = ((flags) & ((int)KeyFlags.KF_UP >> 8)) > 0; //TODO: why is this code ignoring virtual keys and mapping it custom? //TODO: figure out what extended 2 is supposed to do from the raw input opentk code.... var is_valid = true; Key key = WinKeyMap.TranslateKey(scancode, vkey, extended, false, out is_valid); if (is_valid) { if (eventArguments.KeyboardState == Native.KeyboardState.KeyDown || eventArguments.KeyboardState == Native.KeyboardState.SysKeyDown) { OnKeyDown(key); fEatKeyStroke = KeyDownArgs.Handled; } if (eventArguments.KeyboardState == Native.KeyboardState.KeyUp || eventArguments.KeyboardState == Native.KeyboardState.SysKeyUp) { OnKeyUp(key); fEatKeyStroke = KeyUpArgs.Handled; } } } return(fEatKeyStroke ? (IntPtr)1 : NativeMethods.CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam)); }
public override void SendKeyUp(Key key) { bool keyup = true; bool altDown = KeyboardState.IsKeyDown(Key.AltLeft) || KeyboardState.IsKeyDown(Key.AltRight); WinKeyMap.ReverseTranslateKey(key, keyup, altDown, out int tscancode, out VirtualKeys tvk, out _, out bool extended); // bool sysKey = (!altDown && key == Key.AltLeft) || (!altDown && key == Key.AltRight) || ((key != Key.AltLeft && key != Key.AltRight && altDown)); int dwFlags = 0x0008 | 0x0002; if (extended) { dwFlags |= 0x0001; } KeyboardState.SetKeyState(key, false); //var altdown = ((tflags) & ((int)KeyFlags.KF_ALTDOWN >> 8)) > 0; //var dlgmode = ((tflags) & ((int)KeyFlags.KF_DLGMODE >> 8)) > 0; //var menumode = ((tflags) & ((int)KeyFlags.KF_MENUMODE >> 8)) > 0; //var repeat = ((tflags) & ((int)KeyFlags.KF_REPEAT >> 8)) > 0; //var up = ((tflags) & ((int)KeyFlags.KF_UP >> 8)) > 0; NativeMethods.INPUT[] inputs; if (extended) { inputs = new[] { new NativeMethods.INPUT { type = NativeMethods.INPUT_KEYBOARD, u = new NativeMethods.InputUnion { ki = new NativeMethods.KEYBDINPUT() { wScan = 0xe0, wVk = 0, dwFlags = 0, dwExtraInfo = NativeMethods.GetMessageExtraInfo() } } }, new NativeMethods.INPUT { type = NativeMethods.INPUT_KEYBOARD, u = new NativeMethods.InputUnion { ki = new NativeMethods.KEYBDINPUT() { wScan = (ushort)tscancode, wVk = (ushort)tvk, dwFlags = (ushort)dwFlags, dwExtraInfo = NativeMethods.GetMessageExtraInfo() } } } }; } else { inputs = new[] { new NativeMethods.INPUT { type = NativeMethods.INPUT_KEYBOARD, u = new NativeMethods.InputUnion { ki = new NativeMethods.KEYBDINPUT() { wScan = (ushort)tscancode, wVk = (ushort)tvk, dwFlags = (ushort)dwFlags, dwExtraInfo = NativeMethods.GetMessageExtraInfo() } } } }; } NativeMethods.SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(NativeMethods.INPUT))); }