Chromium Embedded Framework绑定按键

时间:2014-05-14 06:25:47

标签: c++ bind keypress chromium-embedded

我在Chromium Embedded Framework的官方论坛上看到了thread,但似乎没有给出解决方案。说实话,我对C ++平台感到不舒服。你能帮我提供一个将CEF绑定到webapp的片段。

我想使用默认控件来控制应用程序:

ALT + F4 - 关闭
F5 - 刷新浏览器

1 个答案:

答案 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 - 这很突出:

  

当浏览器控件具有焦点时,任何按下的键似乎都是   被浏览器控制吃掉,无论它们是否也可以   由浏览器控件处理或不处理。

现在有两种选择:

  1. 在发送到CEF引擎之前拦截按键 ,这需要花费很多时间来挖掘CEF并且是特定于平台的。

  2. 使用普通的Javascript事件处理程序捕获按键,并回调到C ++。

  3. 如果CEF具有此类接口,则在CEF引擎处理之前拦截按键 - 理想情况下,这将是平台独立的。

  4. 在Native-App级别捕获Keypress

    在Windows机器上,我尝试搜索WM_KEYDOWN,这是捕获关键事件(See Here)的常用做法。我无法对我正在运行的CefClient项目进行任何点击,所以这是一个死胡同。

    任何有关此问题的进一步信息的人,请编辑并添加到此。

    在JS中捕获Keypress并回调到C ++

    一旦按键进入CefBrowser,我们总是可以使用Javascript捕获我们想要的按键,然后调用app处理程序,如下所示:

    $(document).keypress(function (e) {
      ...
      NativeAppFunction();
      //Or NativeAppExtension.Function();
    }
    

    JS和C ++之间的通信是通过V8Extensions或通过将Function绑定到CefContext来完成的。有关详情,请访问Javascript Integration

    这带来了一些陷阱 - 您的事件捕获器只是另一个Javascript事件处理程序&#39;并且随之而来的是调用它的时间(在其他事件处理程序之前或之后)的所有不确定性等等。值得庆幸的是,CEF有一个漂亮的小CefKeyboardHandler 只是为了做你想做的事情!

    使用CefKeyboardHandler

    拦截Keypress

    请参阅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

    Full text at MSDN