WebView2教程(基于C++)【四】JS与C++互访(上)

我们可以在JS中,通过postMessage方法向C++发送消息,代码如下

window.chrome.webview.postMessage(window.document.URL)

C++中要想接收消息,必须注册一个WebMessageReceived事件,

在WebView2控件成功添加到窗口上时,我们就可以注册事件了,代码如下:

EventRegistrationToken token;
auto messageReceivedCB = Callback<ICoreWebView2WebMessageReceivedEventHandler>(this, &Win::messageReceived);
webview->add_WebMessageReceived(messageReceivedCB.Get(), &token);

这个事件的回调方法如下:

HRESULT Win::messageReceived(ICoreWebView2* webview, ICoreWebView2WebMessageReceivedEventArgs* args)
{
    wil::unique_cotaskmem_string messageRaw;
    args->TryGetWebMessageAsString(&messageRaw);
    std::wstring message = messageRaw.get();
    return S_OK;
}

现在你可以在HTML页面中写下本文最开始时提到的那句JS代码,运行程序,就会发现回调方法得到了当前页面的URL,如下图所示:

我们也可以在WebView2控件成功添加到窗口上时,给页面注入一段JS代码,如下所示:

std::wstring script = L"window.chrome.webview.postMessage(window.document.URL);console.log(456);";
hr = webview->AddScriptToExecuteOnDocumentCreated(script.c_str(), nullptr);

这段JS脚本并不会马上执行,而是要等到页面成功加载之后才会执行。

当然,我们也可以在C++这边向JavaScript那边发送消息

C++代码如下:

webview->PostWebMessageAsString(L"allen");

JavaScript接收消息的代码如下:

window.chrome.webview.addEventListener("message", (e) => {
    console.log(e);
})

打印出来的内容是:

在上面的代码中,我们都是用字符串传递数据的,也可以用JSON传递数据:

webview->PostWebMessageAsJson(L"{\"name\":123 }");

注意:传递的JSON必须是符合格式要求的,不然JavaScript接不到这个消息。

前面JavaScript发送消息给C++也可以传递JSON数据。C++只要使用get_WebMessageAsJson方法即可。

wil::unique_cotaskmem_string messageRaw;
args->get_WebMessageAsJson(&messageRaw);
std::wstring message = messageRaw.get();

下面是发送消息的JS代码:

window.chrome.webview.postMessage({ name :1234 })

结果如下图所示:

 这里得到的JSON也是字符串,要想序列化,就用咱们前面文章提到过的RappidJSON序列化即可。

WebView2 是一个基于 Chromium 的 Web 视图控件,它可以嵌入到 Windows 应用程序中,方便开发者在应用程序中加载和显示 Web 内容。以下是关于 WebView2 的简要教程。 1. 下载和安装:首先,需要从 Microsoft 的官方网站下载 WebView2 运行时和开发工具包。安装完毕后,可以在 Visual Studio 中创建一个新的项目,并在项目中添加 WebView2 控件。 2. 初始化 WebView2 控件:在加载 WebView2 控件之前,需要进行初始化。可以通过在 MainForm 的代码中添加以下代码行来实现初始化: ```csharp private async void Form1_Load(object sender, EventArgs e) { await WebView.EnsureCoreWebView2Async(null); } ``` 这段代码会使应用程序等待 WebView2 控件初始化完成,然后可以继续加载其他内容。 3. 加载网页内容:通过 WebView2 控件的 `Source` 属性可以加载指定 URL 的网页内容,也可以直接加载 HTML 字符串。示例如下: ```csharp private void LoadWebPage() { WebView.Source = new Uri("https://www.example.com"); // 加载指定 URL 的网页 // 或者: WebView.NavigateToString("<html><body><h1>Hello, World!</h1></body></html>"); // 加载 HTML 字符串 } ``` 4. 响应网页事件:WebView2 允许开发者对网页中的事件进行响应,例如点击链接、提交表单等。可以通过订阅 WebView2 控件的 `NavigationStarting`、`ContentLoading` 和 `NavigationCompleted` 等事件来实现。示例如下: ```csharp private void WebView_NavigationStarting(object sender, CoreWebView2NavigationStartingEventArgs e) { // 处理网页导航开始事件 } private void WebView_ContentLoading(object sender, CoreWebView2ContentLoadingEventArgs e) { // 处理网页内容加载事件 } private void WebView_NavigationCompleted(object sender, CoreWebView2NavigationCompletedEventArgs e) { // 处理网页导航完成事件 } ``` 通过这些事件,可以在应用程序中做出相应的处理,例如更新 UI、获取表单数据等操作。 总而言之,WebView2 是一个强大的工具,可以帮助开发者在 Windows 应用程序中加载和显示 Web 内容。通过以上简要教程,可以了解如何使用 WebView2 控件来加载网页内容,并对网页中的事件进行响应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值