在谷歌浏览器中点击设置,地址栏里出现的不是普通网址,而是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

在cef中使用自定义协议(scheme)的更多相关文章

  1. 自定义 URL Scheme 完全指南

    本文由 Migrant 翻译自 The Complete Tutorial on iOS/iPhone Custom URL Schemes,转载请注明出处. 注意: 自从自定义 URL 的引入,本文 ...

  2. C#综合揭秘——通过修改注册表建立Windows自定义协议

    引言 本文主要介绍注册表的概念与其相关根项的功能,以及浏览器如何通过连接调用自定义协议并与客户端进行数据通信.文中讲及如何通过C#程序.手动修改.安装项目等不同方式对注册表进行修改.其中通过安装项目对 ...

  3. 自定义 URL Scheme 完全指南(转载)

    iPhone / iOS SDK 最酷的特性之一就是应用将其自身”绑定”到一个自定义 URL scheme 上,该 scheme 用于从浏览器或其他应用中启动本应用. 注册自定义 URL Scheme ...

  4. java-cef系列视频第四集:自定义协议

    上一集我们介绍了如何为java-cef添加flashplayer支持. 本视频介绍java-cef中的自定义协议 本作品采用知识共享署名-非商业性使用-禁止演绎 3.0 中国大陆许可协议进行许可.

  5. 【转】C#综合揭秘——通过修改注册表建立Windows自定义协议

    引言 本文主要介绍注册表的概念与其相关根项的功能,以及浏览器如何通过连接调用自定义协议并与客户端进行数据通信.文中讲及如何通过C#程序.手动修改.安装项目等不同方式对注册表进行修改.其中通过安装项目对 ...

  6. 自定义URL Scheme完全指南

    iPhone / iOS SDK 最酷的特性之一就是应用将其自身”绑定”到一个自定义 URL scheme 上,该 scheme 用于从浏览器或其他应用中启动本应用. 注册自定义 URL Scheme ...

  7. 通过修改注册表建立Windows自定义协议

    引言 本文主要介绍注册表的概念与其相关根项的功能,以及浏览器如何通过连接调用自定义协议并与客户端进行数据通信.文中讲及如何通过C#程序.手动修改.安装项目等不同方式对注册表进行修改.其中通过安装项目对 ...

  8. iOS 自定义 URL Scheme 完全指南

    http://www.cocoachina.com/industry/20140522/8514.html “”   阅读器 自定义URL Scheme 本文转自Migrant的博客,原文:<T ...

  9. CEF 自定义用户协议(scheme)实现以二进制流的方式显示图片、视频、音频

    转载:https://www.cnblogs.com/sinceret/p/10417941.html 转载:https://stackoverflow.com/questions/48811756/ ...

随机推荐

  1. Tomcat中的Listener源码片段解读

    @Override public <T extends EventListener> void addListener(T t) { if (!context.getState().equ ...

  2. python简述

    python男神:龟叔 三,python基础初识. 1,运行python代码. 在d盘下创建一个t1.py文件内容是: print('hello world') 打开windows命令行输入cmd,确 ...

  3. E - Stones 优先队列

    来源1896 Because of the wrong status of the bicycle, Sempr begin to walk east to west every morning an ...

  4. 使用call、apply和bind解决js中烦人的this,事件绑定时的this和传参问题

    1.什么是this 在JavaScript中this可以是全局对象.当前对象或者任意对象,这完全取决于函数的调用方式,this 绑定的对象即函数执行的上下文环境(context). 为了帮助理解,让我 ...

  5. SVN和Git对比梳理

    在日常运维工作中,经常会用到版本控制系统,目前用到最广泛的版本控制器就是SVN和Git,那么这两者之间有什么不同之处呢?SVN(Subversion)是集中式管理的版本控制器,而Git是分布式管理的版 ...

  6. WinDbg 之 SOS扩展命令

    SOS.dll (SOS debugging extension) The SOS Debugging Extension (SOS.dll) helps you debug managed prog ...

  7. python-----函数参数类型

    #函数参数类型:1 位置参数 2 默认参数 3 关键字参数 4可变参数 包裹位置参数*args 包裹关键字参数 **kargs#参数位置顺序:先位置参数,默认参数,包裹位置,包裹关键字(定义和调用都应 ...

  8. day19:常用模块(collections,time,random,os,sys)

    1,正则复习,re.S,这个在用的最多,re.M多行模式,这个主要改变^和$的行为,每一行都是新串开头,每个回车都是结尾.re.L 在Windows和linux里面对一些特殊字符有不一样的识别,re. ...

  9. post方式接口测试(一)_新建测试用例

    第一种方式:拷贝别人的 第二种方式:自己创建 二.打开浏览器(此处chrome),F12打开开发模式,输入网址登录,此时可获取到登录的 Request URL 二.打开postman,进入自己的Col ...

  10. libvirt虚拟库

    转载自:https://www.ibm.com/developerworks/cn/linux/l-libvirt/index.html Libvirt 虚拟化库剖析   讲到向外扩展计算(比如云计算 ...