欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

让基于CEF的应用支持自定义协议

程序员文章站 2022-07-01 12:46:55
...
                     

基于CEF开发浏览器或Native与Web混合的富客户端,可以支持自定义协议,当点击网页上的自定义协议链接时,调用系统注册的协议处理程序。

实现分两部分:

  • 修改注册表注册自定义协议
  • 基于CEF的代码

修改注册表注册自定义协议

假定我们注册协议是mypro,照下面做即可:

  1. 在HKEY_CLASSES_ROOT下新建项mypro
  2. 在mypro下新建字符串值“URL Protocol”,这个字符串值的数值数据可有可无
  3. 在mypro下新建shell项,shell下新建open项,open下新建command项
  4. 在command项的默认值是字符串值,里面填写类似[“C:\Windows\System32\notepad.exe” “%1”]这样的内容

这样准备工作就做好了。抓了俩图,对着看看吧。

让基于CEF的应用支持自定义协议

让基于CEF的应用支持自定义协议

CEF代码实现

在实现CefClient的派生类时,实现CefRequestHandler即可,类似下面:

class ClientHandler : public CefClient,    public CefRequestHandler{  ...}
  • 1
  • 2
  • 3
  • 4
  • 5

要重写的CefRequestHandler接口有两个:

  • OnBeforeBrowse
  • OnProtocolExecution

大概说一下这两个虚函数。

OnBeforeBrowse的原型如下:

  virtual bool OnBeforeBrowse(CefRefPtr<CefBrowser> browser,                              CefRefPtr<CefFrame> frame,                              CefRefPtr<CefRequest> request,                              bool is_redirect);
  • 1
  • 2
  • 3
  • 4

前两个参数不说了,关键是第三个,它代表了请求,request->GetURL()就能拿到URL,进而可以判断是否是我们的mypro协议。

OnBeforeBrowse函数在一个页面打开之前调用,如果你返回false,页面会继续加载,如果返回true,就停止加载了。如果你发现是mypro协议,就返回true,让OnProtocolExecution函数继续处理,否则返回false,让浏览器继续加载。

重写的OnBeforeBrowse代码大概如下:

bool ClientHandler::OnBeforeBrowse(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request, bool is_redirect){    std::wstring url = request->GetURL().ToWString();    return url.find_first_of(L"mypro://") == 0;}
  • 1
  • 2
  • 3
  • 4
  • 5

OnProtocolExecution的原型如下:

virtual void OnProtocolExecution(CefRefPtr<CefBrowser> browser,                                   const CefString& url,                                   bool& allow_os_execution) ;
  • 1
  • 2
  • 3

注意第三个参数,allow_os_execution,它默认值为false,不会调用注册表内注册的自定义协议,需要修改它为true。

第二参数是来自<a>标签的href属性的值,就是URL。如果你想自己在C++代码里处理,可以直接启动一个应用来处理这个URL,如果你想交给系统处理,只要修改allow_os_execution为true即可。

重写的OnProtocolExecution代码类似下面:

void ClientHandler::OnProtocolExecution(CefRefPtr<CefBrowser> browser,    const CefString& url,    bool& allow_os_execution){    // do something with url...    allow_os_execution = true;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

代码实现Ok了。

测试

测试网页内容如下:

<!DOCTYPE html><html><head>  <meta charset="UTF-8">  <title>Test</title></head><body>  <p><a  href="mypro://xxx">My Protocol<a/></p></body></html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

运行效果如下:

让基于CEF的应用支持自定义协议


CEF专栏:http://blog.csdn.net/column/details/cef-ppapi.html

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow