简洁版本:实施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
. Check client_handler_win.cpp
更长的版本如下...
看着这个线程 -- 这很突出:
当浏览器控件获得焦点时,按下的任何键似乎
被浏览器控件吃掉,不管是否也可以
是否由浏览器控件处理。
现在有两个选择:
拦截按键在发送到 CEF 引擎之前,这需要深入研究 CEF 并针对特定平台。
使用普通的 Javascript 事件处理程序捕获按键,并回调到 C++。
拦截按键在 CEF 引擎处理它之前如果 CEF 有这样的接口 - 理想情况下这将是独立于平台的。
在本机应用程序级别捕获按键
在 Windows 机器上,我尝试搜索WM_KEYDOWN
这是捕获关键事件的通常做法(See Here https://stackoverflow.com/questions/6332364/wm-keydown-capturing-keypress-causing-event)。我无法获得任何点击CefClient
我正在运行的项目,所以这是一个死胡同。
任何对此有更多信息的人,请编辑并添加到此。
在 JS 中捕获按键并回调到 C++
一旦按键进入CefBrowser
,我们总是可以使用 Javascript 来捕获我们想要的按键,然后调用应用程序处理程序,如下所示:
$(document).keypress(function (e) {
...
NativeAppFunction();
//Or NativeAppExtension.Function();
}
JS 和 C++ 之间的通信是通过 V8Extensions 或通过将函数绑定到 CefContext 来完成的。更多信息请访问JavaScript 集成 https://code.google.com/p/chromiumembedded/wiki/JavaScriptIntegration
这会带来一些陷阱 - 你的事件捕获器“只是另一个 Javascript 事件处理程序”,随之而来的是调用它的时间(在其他事件处理程序之前或之后)的所有不确定性等等。值得庆幸的是,CEF 有一个漂亮的小CefKeyboardHandler
只为做自己想做的事!
使用拦截按键CefKeyboardHandler
See cef_keyboard_handler.h
- 文档OnPreKeyEvent()
says:
// 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
解析为特定于平台的(遗憾的是 - 哦好吧!)标准 WindowsMSG
。请注意,Alt+F4 是一个特殊的系统命令:
当您按下某个键时,具有键盘焦点的窗口会收到一个
以下消息。
WM_SYSKEYDOWN(或)WM_KEYDOWN
WM_SYSKEYDOWN 消息表示一个系统键,这是调用一个系统键的击键
系统命令。系统键有两种:ALT+任意键和F10
全文参见 MSDN http://msdn.microsoft.com/en-us/library/windows/desktop/gg153546(v=vs.85).aspx