我在Chromium Embedded Framework的官方论坛上看到了thread,但似乎没有给出解决方案。说实话,我对C ++平台感到不舒服。你能帮我提供一个将CEF绑定到webapp的片段。
我想使用默认控件来控制应用程序:
ALT + F4 - 关闭
F5 - 刷新浏览器
答案 0 :(得分:7)
简短版本:实施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
项目进行任何点击,所以这是一个死胡同。
任何有关此问题的进一步信息的人,请编辑并添加到此。
一旦按键进入CefBrowser
,我们总是可以使用Javascript捕获我们想要的按键,然后调用app处理程序,如下所示:
$(document).keypress(function (e) {
...
NativeAppFunction();
//Or NativeAppExtension.Function();
}
JS和C ++之间的通信是通过V8Extensions或通过将Function绑定到CefContext来完成的。有关详情,请访问Javascript Integration
这带来了一些陷阱 - 您的事件捕获器只是另一个Javascript事件处理程序&#39;并且随之而来的是调用它的时间(在其他事件处理程序之前或之后)的所有不确定性等等。值得庆幸的是,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消息表示系统密钥,它是调用a的密钥笔划 系统命令。有两种类型的系统密钥:ALT +任意密钥和F10