短版:实现CefKeyboardHandler,特别是OnPreKeyEvent()
ClientHandler::OnPreKeyEvent(CefRefPtr<CefBrowser> browser,
const CefKeyEvent& event,
CefEventHandle os_event,
bool* is_keyboard_shortcut) {
if (os_event && os_event->message == WM_SYSKEYDOWN) {
case VK_F10: HandleF10(); break;
case VK_F4: HandlerF4(); break; //Use GetKeyState(VK_MENU) to check if ALT is down...
}
}
这遵循CefClient 项目,其中ClientHandler 实现CefKeyboardHandler。检查client_handler_win.cpp
以下是更长的版本...
看看这个帖子 - Keyboard events "eaten" by browser - 这很明显:
当浏览器控件获得焦点时,按下的任何键似乎
被浏览器控件吃掉,不管它们是否也可以
是否由浏览器控件处理。
现在有两种选择:
在发送到 CEF 引擎之前拦截按键,这需要对 CEF 进行大量挖掘并且是特定于平台的。
使用普通的 Javascript 事件处理程序捕获按键,并回调到 C++。
如果 CEF 具有此类接口,在 CEF 引擎处理它之前拦截按键 - 理想情况下,这将独立于平台。
在本机应用级别捕获按键
在 Windows 机器上,我尝试搜索 WM_KEYDOWN,这是捕获关键事件的常用做法 (See Here)。我无法在我正在运行的CefClient 项目上获得任何点击,所以这是一条死胡同。
任何对此有更多信息的人,请编辑并添加到此。
在 JS 中捕获按键并回调到 C++
一旦按键进入CefBrowser,我们总是可以使用 Javascript 来捕获我们想要的按键,然后调用应用程序处理程序,如下所示:
$(document).keypress(function (e) {
...
NativeAppFunction();
//Or NativeAppExtension.Function();
}
JS 和 C++ 之间的通信是通过 V8Extensions 或通过将 Function 绑定到 CefContext 来完成的。更多信息Javascript Integration
这带来了一些陷阱——你的事件捕获器“只是另一个 Javascript 事件处理程序”,随之而来的是它被调用的所有不确定性(在其他事件处理程序之前或之后)等等。值得庆幸的是,CEF 有一个漂亮的小 CefKeyboardHandler只是为了做你想做的事!
使用CefKeyboardHandler拦截按键
参见cef_keyboard_handler.h - OnPreKeyEvent() 的文档说:
// Called before a keyboard event is sent to the renderer. |event| contains
// information about the keyboard event. |os_event| is the operating system
// event message, if any. Return true if the event was handled or false
// otherwise. If the event will be handled in OnKeyEvent() as a keyboard
// shortcut set |is_keyboard_shortcut| to true and return false.
从这里开始,它非常简单。 CefEventHandle 解析为特定于平台的(可悲的是 - 哦,好吧!)标准 Windows MSG。注意 Alt+F4 是一个特殊的系统命令:
当您按下一个键时,具有键盘焦点的窗口会收到一个
以下消息。
WM_SYSKEYDOWN(或)WM_KEYDOWN
WM_SYSKEYDOWN 消息指示系统键,它是调用
系统命令。系统键有两种:ALT+任意键和F10
Full text at MSDN