【问题标题】:Chromium Embedded Framework bind key pressChromium Embedded Framework 绑定按键
【发布时间】:2014-05-14 06:25:46
【问题描述】:

我在 Chromium Embedded Framework 的官方论坛上看到了这个thread,但似乎没有给出解决方案。老实说,我对 C++ 平台并不满意。您能否帮我提供一个将 CEF 绑定到 webapp 的 sn-p。

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

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

【问题讨论】:

  • 您是否正在寻找能够捕获关键事件并将其发送到 CEF 的 C++ 代码?我相信这在 CEFClient 中默认发生(假设你正在构建它) - 毕竟你可以输入 CEF 文本框......
  • 添加了答案 - 唷,这需要时间!

标签: c++ bind keypress chromium-embedded


【解决方案1】:

短版:实现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 引擎处理它之前拦截按键 - 理想情况下,这将独立于平台。

在本机应用级别捕获按键

在 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

【讨论】:

  • 你能在 OnPreKeyEvent() 中获取鼠标状态吗?
猜你喜欢
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 2016-01-29
  • 2014-07-26
  • 1970-01-01
  • 2014-06-07
  • 2012-09-03
  • 1970-01-01
相关资源
最近更新 更多