使用cef向html发送数据并进行加载,请给出完整的代码示例
时间: 2024-02-25 19:51:23 浏览: 209
以下是一个使用CEF向HTML发送数据并进行加载的完整代码示例:
```cpp
#include "include/cef_app.h"
#include "include/cef_client.h"
#include "include/views/cef_browser_view.h"
#include "include/views/cef_window.h"
#include "include/wrapper/cef_helpers.h"
#include "include/wrapper/cef_message_router.h"
class MyClient : public CefClient, public CefMessageRouterBrowserSide::Handler {
public:
MyClient() {}
CefRefPtr<CefBrowser> GetBrowser() {
return m_Browser;
}
virtual CefRefPtr<CefMessageRouterBrowserSide> GetMessageRouterBrowserSide() override {
return m_MessageRouterBrowserSide;
}
virtual bool OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefProcessId source_process, CefRefPtr<CefProcessMessage> message) override {
return m_MessageRouterBrowserSide->OnProcessMessageReceived(browser, frame, source_process, message);
}
virtual void OnAfterCreated(CefRefPtr<CefBrowser> browser) override {
m_Browser = browser;
m_MessageRouterBrowserSide = CefMessageRouterBrowserSide::Create(m_MessageHandler);
m_MessageRouterBrowserSide->AddHandler(this, false);
}
virtual void OnBeforeClose(CefRefPtr<CefBrowser> browser) override {
m_MessageRouterBrowserSide->OnBeforeClose(browser);
m_Browser = nullptr;
}
IMPLEMENT_REFCOUNTING(MyClient)
private:
CefRefPtr<CefBrowser> m_Browser;
CefRefPtr<CefMessageRouterBrowserSide> m_MessageRouterBrowserSide;
CefMessageRouterBrowserSide::HandlerSet m_MessageHandler;
};
class MyHandler : public CefMessageRouterBrowserSide::Handler {
public:
MyHandler() {}
virtual bool OnQuery(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, int64 query_id, const CefString& request, bool persistent, CefRefPtr<Callback> callback) override {
if (request == "getData") {
CefRefPtr<CefProcessMessage> message = CefProcessMessage::Create("sendData");
message->GetArgumentList()->SetString(0, "Hello, HTML!");
browser->GetMainFrame()->SendProcessMessage(PID_RENDERER, message);
callback->Success("");
return true;
}
return false;
}
IMPLEMENT_REFCOUNTING(MyHandler)
};
class MyRenderProcessHandler : public CefRenderProcessHandler {
public:
virtual void OnContextCreated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context) override {
CefRefPtr<CefMessageRouterRendererSide> messageRouterRendererSide = CefMessageRouterRendererSide::Create();
messageRouterRendererSide->AddHandler(new MyHandler(), false);
frame->SetMessageRouter(messageRouterRendererSide);
}
};
class MyBrowser : public CefBrowserProcessHandler {
public:
virtual void OnContextInitialized() override {
CefMessageRouterConfig messageRouterConfig;
messageRouterConfig.js_query_function = "query";
messageRouterConfig.js_cancel_function = "cancel";
CefMessageRouterBrowserSide::Create(messageRouterConfig);
}
virtual CefRefPtr<CefRenderProcessHandler> GetRenderProcessHandler() override {
return new MyRenderProcessHandler();
}
};
int main(int argc, char** argv) {
CefMainArgs main_args(argc, argv);
CefRefPtr<MyBrowser> browser(new MyBrowser());
int exit_code = CefExecuteProcess(main_args, browser.get(), nullptr);
if (exit_code >= 0) {
return exit_code;
}
CefSettings settings;
settings.multi_threaded_message_loop = true;
CefInitialize(main_args, settings, browser.get(), nullptr);
CefRefPtr<MyClient> client(new MyClient());
CefBrowserView::CreateBrowserView(client, "about:blank")->GetBrowser()->GetMainFrame()->LoadURL("file:///path/to/your/html/file.html");
CefRunMessageLoop();
CefShutdown();
return 0;
}
```
这个示例使用了 CEF(Chromium Embedded Framework),它是一个嵌入式浏览器框架,让你可以将 Chromium 引擎嵌入到你的应用程序中。这个示例中,我们创建了一个 CEF 客户端(`MyClient`)和一个 CEF 处理程序(`MyHandler`),并在渲染进程中使用它们。
`MyClient` 类是一个继承自 `CefClient` 的类,它实现了 `CefMessageRouterBrowserSide::Handler` 接口。在 `OnAfterCreated` 方法中,我们创建了一个 `CefMessageRouterBrowserSide` 对象,并将 `MyHandler` 添加到它的处理程序列表中。在 `OnBeforeClose` 方法中,我们将 `CefMessageRouterBrowserSide` 对象从处理程序列表中移除。
`MyHandler` 类同样继承自 `CefMessageRouterBrowserSide::Handler` 接口,并实现了其中的 `OnQuery` 方法。当 HTML 页面通过 JavaScript 调用 `query` 函数并传递参数 `"getData"` 时,我们将创建一个名为 `"sendData"` 的 `CefProcessMessage`,并将 `"Hello, HTML!"` 作为参数发送给 HTML 页面。最后,我们调用 `callback->Success("")` 表示处理成功,并返回一个空字符串。
`MyRenderProcessHandler` 类继承自 `CefRenderProcessHandler` 接口,在 `OnContextCreated` 方法中创建了一个 `CefMessageRouterRendererSide` 对象,并将 `MyHandler` 对象添加到它的处理程序列表中。这样,在 HTML 页面中就可以通过 JavaScript 调用 `query` 函数并传递参数 `"getData"` 来触发 `MyHandler::OnQuery` 方法。
最后,在 `main` 函数中,我们先调用 `CefExecuteProcess` 函数,如果返回值大于等于 0,则说明当前进程是子进程,直接返回即可。否则,我们初始化 CEF,并创建一个 `MyClient` 对象,将其传递给 `CefBrowserView::CreateBrowserView` 函数,从而创建一个浏览器窗口,并加载 HTML 文件。最后,我们调用 `CefRunMessageLoop` 函数进入消息循环,直到应用程序退出。
阅读全文