// returns true if event is handled private void ProcessKeyboardEvent(int nCode, IntPtr wParam, IntPtr lParam, out bool isHandled) { isHandled = false; try { if (nCode < 0) { return; } bool isKeyDownEvent = false; switch (wParam.ToInt32()) { case LowLevelAdapter.WM_KEYDOWN: case LowLevelAdapter.WM_SYSKEYDOWN: isKeyDownEvent = true; goto case LowLevelAdapter.WM_KEYUP; case LowLevelAdapter.WM_KEYUP: case LowLevelAdapter.WM_SYSKEYUP: var keybdinput = (KEYBDINPUT)Marshal.PtrToStructure(lParam, typeof(KEYBDINPUT)); var keyData = (Keys)keybdinput.Vk; keyData |= LowLevelAdapter.KeyPressed(Keys.ControlKey) ? Keys.Control : 0; keyData |= LowLevelAdapter.KeyPressed(Keys.Menu) ? Keys.Alt : 0; keyData |= LowLevelAdapter.KeyPressed(Keys.ShiftKey) ? Keys.Shift : 0; var winPressed = LowLevelAdapter.KeyPressed(Keys.LWin) || LowLevelAdapter.KeyPressed(Keys.RWin); var args = new KeyboardEventArgs(keyData, winPressed, isKeyDownEvent ? KeyboardEventType.KeyDown : KeyboardEventType.KeyUp); OnKeyboardEvent(args); isHandled = args.Handled; break; } } catch { } }