在谷歌浏览器中点击设置,地址栏里出现的不是普通网址,而是chrome://settings/

这个地址就是谷歌浏览器的自定义scheme,cef也提供了自定义协议手段。主要是通过

以下几步:

1.继承一个工厂类MySchemeHandlerFactory : public CefSchemeHandlerFactory

需要包含#include "include/cef_scheme.h"

class MySchemeHandlerFactory : public CefSchemeHandlerFactory
{
public:
virtual CefRefPtr<CefResourceHandler> Create(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
const CefString& scheme_name,
CefRefPtr<CefRequest> request)
OVERRIDE {
// Return a new resource handler instance to handle the request.
return new MyResourceHandler();
}
private:
IMPLEMENT_REFCOUNTING(MySchemeHandlerFactory);
};

2.继承一个资源类class MyResourceHandler : public CefResourceHandler

class MyResourceHandler : public CefResourceHandler
{
public:
MyResourceHandler() {} virtual bool ProcessRequest(CefRefPtr<CefRequest> request,
CefRefPtr<CefCallback> callback)
OVERRIDE {
std::string url = request->GetURL(); //if (strstr(url.c_str(), "handler.html") != NULL)
data_ = "hello cef";//返回到页面中的内容
callback->Continue();//这个一定要有
return true;//
} virtual void GetResponseHeaders(CefRefPtr<CefResponse> response,
int64& response_length,
CefString& redirectUrl) OVERRIDE {
response->SetMimeType("text/html");
response->SetStatus();
response_length = data_.length() ;
} virtual void Cancel() OVERRIDE {
// Cancel the response...
} virtual bool ReadResponse(void* data_out,
int bytes_to_read,
int& bytes_read,
CefRefPtr<CefCallback> callback)
OVERRIDE {
int size =static_cast<int>(data_.length());
memcpy(data_out, data_.c_str(), size);
bytes_read = size;
return true;
} private:
std::string data_;
IMPLEMENT_REFCOUNTING(MyResourceHandler);
};

3.在初始化cef那几行代码后面增加一句

CefRegisterSchemeHandlerFactory("sin", "test", new MySchemeHandlerFactory());

    CefSettings settings;
CefSettingsTraits::init(&settings);
settings.multi_threaded_message_loop = true;
CefRefPtr<SimpleApp> app(new SimpleApp);
CefInitialize(main_args, settings, app.get(), sandbox_info);
//自定义scheme
CefRegisterSchemeHandlerFactory("sin", "test", new MySchemeHandlerFactory());

4.我看有的教程里写的还要在自定义的CefApp类中修改OnRegisterCustomSchemes函数,增加

registrar->AddCustomScheme("sin", true, false, false, false, true, false);

但是我添加还是不添加都没有问题,都可以出来。

5.这时,运行程序,在地址栏输入sin://test之后就会显示页面,内容是hello cef

6.在第2步中,如果不注释if语句if (strstr(url.c_str(), "handler.html") != NULL)

那么,就需要输入sin://test/handler.html才能显示内容hello cef

最新文章

  1. 【转】SQL Server -- 已成功与服务器建立连接,但是在登录过程中发生错误
  2. 获取youku视频下载链接(wireshark抓包分析)
  3. RMAN Catalog创建、配置和管理
  4. 5、ASP.NET MVC入门到精通——NHibernate代码映射
  5. HDU 2544 单源最短路
  6. 使用RMAN从磁带库恢复归档文件
  7. d3d导致cairo不正常
  8. HDU2544最短路(dijkstra)
  9. TFS统计编码行数语句
  10. Python成长之路第二篇(1)_数据类型内置函数用法
  11. Hibernate 系列教程13-继承-鉴别器与内连接相结合
  12. 201521123049 《JAVA程序设计》 第14周学习总结
  13. JAVA8之lambda表达式具体解释,及stream中的lambda使用
  14. iOS监听模式系列之NSNotificationCenter的简单使用
  15. MVC实战之排球计分软件(深入了解面向对象编程)
  16. 洛谷P3085 [USACO13OPEN]阴和阳Yin and Yang(点分治,树上差分)
  17. c#: 模态窗口最小化主窗口
  18. 关于checkbox选中问题总结
  19. 大量的源文件添加到Android.mk的问题
  20. MySQL升级方法一

热门文章

  1. 10.27 rest_framework(1)
  2. python3 小工具
  3. Nestjs 接口验证
  4. redis(四)--简单实现Redis缓存中的排序功能
  5. oracle 字符转换成数字
  6. mac homebrew
  7. 【python】——sql模拟
  8. 剑指offer——python【第44题】翻转单词顺序
  9. juqery 点击分页显示,指定一页显示多少个,首次加载显示多少个
  10. python全栈开发 * 15知识点汇总 * 180621