QT集成CEF06-F12开启DevTools窗口

​ 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 用独立的窗口打开开发者工具可以使用 CefWindowInfoCefBrowserHost::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版权协议,转载请附上原文出处链接和本声明。