Chromium 嵌入式框架绑定按键

2024-01-12

我看到了这个在Chromium Embedded Framework的官方论坛上,但似乎没有给出解决方案。说实话,我对C++平台不太适应。您能帮我提供一个将 CEF 绑定到 web 应用程序的代码片段吗?

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

ALT+F4 - close
F5 - refresh browser


简洁版本:实施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

更长的版本如下...


看着这个线程 -- 这很突出:

当浏览器控件获得焦点时,按下的任何键似乎 被浏览器控件吃掉,不管是否也可以 是否由浏览器控件处理。

现在有两个选择:

  1. 拦截按键在发送到 CEF 引擎之前,这需要深入研究 CEF 并针对特定平台。

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

  3. 拦截按键在 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Chromium 嵌入式框架绑定按键 的相关文章

随机推荐

  • Django 迁移到新数据库

    我刚刚加入一个使用 Django 的项目 并尝试初始化我自己的开发服务器 当我尝试这样做时 我的一个应用程序的迁移失败 此应用程序的模型有一个 sorl thumbnail ImageField 用于添加徽标 尝试迁移时 我收到以下错误消息
  • [over.load]/1 中下面突出显示的句子是什么意思?

    下面突出显示的句子的含义是什么 它与函数模板有什么关系吗 过载 1 http eel is c draft over load 1 并非所有函数声明都可以重载 那些不能成为的 此处指定了重载 如果程序包含以下内容 则该程序是格式错误的 同一
  • ::after 伪元素出现在之前

    我试图在渐变的顶部和底部创建一个微妙的波浪 但是 after 伪元素出现在主要内容之前而不是之后 目前它显示为 before after 主要内容 但我希望它显示为 before 主要内容 after 这是我的代码 gradient bac
  • couchDB、python 和身份验证

    我已经安装了 couchDB v 0 10 0 并尝试通过从 couchDB wiki 下载的 Couch 类中的 python 与它对话 问题是 Create database mydb error unauthorized reason
  • 对“omp_get_max_threads_”的未定义引用

    我在尝试编译项目时遇到以下错误 fortran 使用 gfortran 对 omp get max threads 的未定义引用 对 omp get thread num 的未定义引用 问题是 我的 GCC 版本是 4 4 3 它应该支持
  • 运行 Julia .jl 文件

    我是朱莉娅的新手 刚刚完成了我的第一个程序 我在 julia studio 中编写了代码 并在该程序中对其进行了测试 它为我提供了所有正确的输出 但 shell 将输出分开 就好像它是两个不同的执行一样 我想知道这是否是我的编译器的问题 所
  • R ggplot2 对只有几个数据点的线图进行轻微平滑

    不确定这是否是一个编程问题 如果我有下面的数据 它会生成一个 尖峰 图表 并且我想使用 ggplot2 生成一个稍微平滑的图表 我该如何最优雅地处理它 通常的平滑方法去除了太多信息 我正在考虑的一种方法是在当前数据集之间插入额外的两个数据点
  • 使用空手道框架时,如何有选择地忽略构建中的某些 .feature 文件?

    我必须忽略使用空手道框架的集成测试套件的某些 feature 测试文件 有什么方法可以有选择地排除某些文件 是的 答案是tags https github com intuit karate test suites Example igno
  • 制作Asus google Nexus 7的模拟器

    我有 android sdk 更新到最新版本 v21 现在我想要的是 制作 Asus google Nexus 7 的模拟器 包含 800 x 1280 分辨率和 216 dpi 当我将 sdk 更新到最新版本时 我无法编辑模拟器当前的 d
  • JSP 自定义标记中的 i18n 翻译

    是否可以编写自定义 JSP 标记来获取 i18n 消息键并输出给定 请求的翻译短语 通常在 JSP JSTL 中 我这样做
  • Google Spell API 和 TinyMCE

    我刚刚使用说明成功实现了 TinyMCE 的拼写检查插件here http ondotnet deap nu 2009 01 implementing tinymce spellchecker with html 不过 我对这个结尾段落感到
  • 在泛型类中使用泛型协议

    我定义了一个协议LLNodeType protocol LLNodeType typealias T var firstNode LLNode
  • knitr 被 data.table `:=` 赋值欺骗

    看起来knitr不明白DT a 1 不应导致输出DT到文档 有办法阻止这种行为吗 Example knitr文档 Data Table Markdown Suppose we make a data table in R Markdown
  • 错误:无法扩展文件“pg_tblspc/4815857/PG_11_201809051/16321”:设备上没有剩余空间

    My postgres table occupied 100 memory并想截断它 当我使用时TRUNCATE TABLE TABLE NAME它给出的声明如下错误 错误 无法扩展文件 pg tblspc 4815857 PG 11 20
  • Laravel 上的用户名作为子域

    我已经设置了通配符子域 domain com 我正在使用以下 htaccess Options FollowSymLinks RewriteEngine On RewriteBase RewriteCond HTTP HOST www Re
  • 在 LibGDX 中将形状绘制为纹理

    我正在游戏中创建菜单 特别是带有圆角和边框的矩形 我可以使用形状渲染器来做到这一点 但我不能混合形状渲染器和精灵批处理器 目前我的分辨率似乎是使用大形状如 PNG 并缩放它们 但在很多设备上这会产生模糊的角落 我已经阅读了关于网格 着色器
  • 如何对具有多个数据源的 Spring Boot 应用程序进行 dockerize?

    我有一个 springboot 应用程序 它使用 postgresql 数据库和 mongoDB 数据库 我已经能够正确配置它们 但现在当我想对我的应用程序进行 dockerize 以便稍后将其部署到 Kubernetes 集群上时 我完全
  • glGetIntegerv 返回垃圾值

    include
  • 如何更改新组件的默认名称

    当您将组件添加到窗体时 Delphi 会设置组件的名称 第一个 TButton 将被命名为 Button1 第二个 Button2 依此类推 不久前我偶然发现你可以更改这个 前缀 继续使用 TButton 我将其更改为 btn 因此 TBu
  • Chromium 嵌入式框架绑定按键

    我看到了这个在Chromium Embedded Framework的官方论坛上 但似乎没有给出解决方案 说实话 我对C 平台不太适应 您能帮我提供一个将 CEF 绑定到 web 应用程序的代码片段吗 我想使用默认控件来控制应用程序 ALT