CefClient 类中提供了 GetKeyboardHandler()
的回调,要求在CefClient 中提供 CefKeyboardHandler
对象。这个对象可以用来响应键盘事件。
本节我们为应用添加
- F12 用来打开开发者工具(DevTools)
- F5 刷新页面
class CefClient : public virtual CefBaseRefCounted {
public:
/// ...省略
///
// Return the handler for keyboard events.
///
/*--cef()--*/
virtual CefRefPtr<CefKeyboardHandler> GetKeyboardHandler() { return nullptr; }
/// ...省略
};
CefKeyboardHandler 接口的定义:
class CefKeyboardHandler : public virtual CefBaseRefCounted {
public:
///
// 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.
/// 键盘事件还没有被浏览器网页中的接收到之前,先执行这个方法。如果返回true,表示这个
/// 事件已经被处理过了。
/*--cef()--*/
virtual bool OnPreKeyEvent(CefRefPtr<CefBrowser> browser,
const CefKeyEvent& event,
CefEventHandle os_event,
bool* is_keyboard_shortcut) {
return false;
}
///
// Called after the renderer and JavaScript in the page has had a chance to
// handle the event. |event| contains information about the keyboard event.
// |os_event| is the operating system event message, if any. Return true if
// the keyboard event was handled or false otherwise.
/// 浏览器网页中的JavaScript 已经处理过之后调用
/*--cef()--*/
virtual bool OnKeyEvent(CefRefPtr<CefBrowser> browser,
const CefKeyEvent& event,
CefEventHandle os_event) {
return false;
}
};
本节要实现的 F12 , F5 都应该在 OnPreKeyEvent 方法中实现,因为这些不需要经过网页。
1 .实现思路
SimpleHandler 类中继续继承
CefKeyboardHandler
, 重写GetKeyboardHandler
方法与OnPreKeyEvent
方法OnPreKeyEvent
方法的 event 参数中包含键盘的 Key Code,根据Key Code 做出响应的逻辑F5刷新页面,直接调用
OnPreKeyEvent
方法的browser 参数的Reload
方法即可F12 用独立的窗口打开开发者工具可以使用
CefWindowInfo
和CefBrowserHost::ShowDevTools
配合完成。
2. 实现步骤
只需要修改 simple_handler.h 和 simple_handler.cc即可. 新加入了 继承 CefKeyboardHandler
// simple_handler.h 文件
class SimpleHandler : public CefClient
,public CefLifeSpanHandler
,public CefKeyboardHandler {
// ... 省略其它代码
//CefKeyboardHandler
virtual CefRefPtr<CefKeyboardHandler> GetKeyboardHandler() OVERRIDE
{
return this;
}
virtual bool OnPreKeyEvent(CefRefPtr<CefBrowser> browser,
const CefKeyEvent& event,
CefEventHandle os_event,
bool* is_keyboard_shortcut);
// ... 省略其它代码
}
// simple_handler.cc 文件
// ... 省略其它代码
bool SimpleHandler::OnPreKeyEvent(CefRefPtr<CefBrowser> browser, const CefKeyEvent& event, CefEventHandle os_event, bool* is_keyboard_shortcut)
{
if (event.type == KEYEVENT_RAWKEYDOWN) {
switch (event.windows_key_code) {
case VK_F5: //刷新页面
browser->Reload();
return true;
case VK_F12: // 打开浏览器开发者工具
CefWindowInfo windowInfo;
CefBrowserSettings settings;
windowInfo.SetAsPopup(NULL, "Dev Tools");
browser->GetHost()->ShowDevTools(windowInfo, this, settings, CefPoint());
return true;
}
}
return false;
}
// ... 省略其它代码
代码请访问 GitHub qt_cef_06分支
版权声明:本文为paopao_wu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。