protected virtual IntPtr SourceHook(IntPtr hWnd, int message, IntPtr wParam, IntPtr lParam, ref bool handled) { if (handled) { return IntPtr.Zero; } switch ((WM)message) { case WM.SYSCHAR: case WM.SYSKEYDOWN: case WM.SYSKEYUP: case WM.KEYDOWN: case WM.KEYUP: case WM.CHAR: case WM.IME_CHAR: if (!IsKeyboardFocused) { break; } if (message == (int)WM.SYSKEYDOWN && wParam.ToInt32() == KeyInterop.VirtualKeyFromKey(Key.F4)) { // We don't want CEF to receive this event (and mark it as handled), since that makes it impossible to // shut down a CefSharp-based app by pressing Alt-F4, which is kind of bad. return IntPtr.Zero; } handled = managedCefBrowserAdapter.SendKeyEvent(message, wParam.CastToInt32(), lParam.CastToInt32()); break; } return IntPtr.Zero; }