1. 程式人生 > >在cef中使用自定義協議(scheme)

在cef中使用自定義協議(scheme)

cancel seh 初始化 dir add virt oms 行程 但是

在谷歌瀏覽器中點擊設置,地址欄裏出現的不是普通網址,而是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(200); 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)