支持的平台:Win32。
先决条件
- 使用 Win32 API 的经验。
异步方法
由于以下任何原因,WebView2 Win32 C++ API 中的异步方法使用委托接口与你联系:
- 异步方法已完成。
- 成功或失败代码。
- 异步方法的结果。
所有异步方法的最后一个参数是指向委托接口的指针,你提供一个实现。
委托接口有一个 Invoke
方法,该方法采用成功或失败代码的第一个 HRESULT
参数 。 此外,如果方法具有结果,则可能有第二个参数是方法的结果。
例如, ICoreWebView2::CapturePreview 方法将 ICoreWebView2CapturePreviewCompletedHandler
指针作为最终参数。 若要发送 CapturePreview
方法请求,请提供实现的 ICoreWebView2CapturePreviewCompletedHandler
指针的实例。
以下代码使用 Invoke
方法实现 ICoreWebView2CapturePreviewCompletedHandler
指针:
HRESULT Invoke(HRESULT result)
实现 Invoke
方法,然后在CoreWebView2
请求完成时CapturePreview
请求Invoke
方法。 单个参数是 HRESULT
描述请求的成功或失败代码的 CapturePreview
。
或者,对于 ICoreWebView2::ExecuteScript
,请提供一个实例,该实例具有一个 Invoke
方法,该方法可为你提供请求的成功或失败代码 ExecuteScript
。 还要提供第二个参数,即运行脚本的结果的 JSON。
可以手动实现 CompleteHandler
委托接口,也可以使用 回调函数 (WRL) 。 在以下 WebView2 代码中使用 回调函数 (WRL) :
void ScriptComponent::InjectScript()
{
TextInputDialog dialog(
m_appWindow->GetMainWindow(),
L"Inject Script",
L"Enter script code:",
L"Enter the JavaScript code to run in the WebView2 control.",
L"window.getComputedStyle(document.body).backgroundColor");
if (dialog.confirmed)
{
m_webView->ExecuteScript(dialog.input.c_str(),
Callback<ICoreWebView2ExecuteScriptCompletedHandler>(
[](HRESULT error, PCWSTR result) -> HRESULT
{
if (error != S_OK) {
ShowFailure(error, L"ExecuteScript failed");
}
MessageBox(nullptr, result, L"ExecuteScript Result", MB_OK);
return S_OK;
}).Get());
}
}
事件
WebView2 Win32 C++ API 中的事件使用 add_EventName
和 remove_EventName
方法对订阅和取消订阅事件。 方法 add_EventName
采用事件处理程序委托接口,并将令牌作为输出参数返回 EventRegistrationToken
。 方法 remove_EventName
获取令牌 EventRegistrationToken
并取消订阅相应的事件订阅。
事件处理程序委托接口
事件处理程序委托接口的工作方式类似于异步方法完成的处理程序委托接口。 实现事件处理程序委托接口,并在 CoreWebView2
事件运行时发送回调。
每个事件处理程序委托接口都有一个 Invoke
方法,该方法具有发送方参数,后跟事件 args 参数。 发送方是为其订阅事件的 对象的实例。 event args 参数是一个接口,其中包含有关当前触发事件的信息。
例如,上的 NavigationCompleted
ICoreWebView2
事件具有 ICoreWebView2::add_NavigationCompleted
和 ICoreWebView2::remove_NavigationCompleted
方法对。 发送请求时,需要提供以前实现Invoke
方法的 实例ICoreWebView2NavigationCompletedEventHandler
。
当 NavigationCompleted
事件运行时,将请求方法 Invoke
:
- 第一个参数运行 事件
NavigationCompleted
。 - 第二个参数包含有关导航是否成功完成等的信息。
与异步方法 completed 处理程序委托接口类似,请使用下列操作之一进行设置:
直接实现它。
使用以下 WebView2 代码中使用的 回调函数 (WRL) 函数:
// Register a handler for the NavigationCompleted event.
// Check whether the navigation succeeded, and if not, do something.
// Also update the Cancel buttons.
CHECK_FAILURE(m_webView->add_NavigationCompleted(
Callback<ICoreWebView2NavigationCompletedEventHandler>(
[this](ICoreWebView2* sender, ICoreWebView2NavigationCompletedEventArgs* args)
-> HRESULT {
BOOL success;
CHECK_FAILURE(args->get_IsSuccess(&success));
if (!success)
{
COREWEBVIEW2_WEB_ERROR_STATUS webErrorStatus;
CHECK_FAILURE(args->get_WebErrorStatus(&webErrorStatus));
if (webErrorStatus == COREWEBVIEW2_WEB_ERROR_STATUS_DISCONNECTED)
{
// Do something here if you want to handle a specific error case.
// In most cases it is not necessary, because the WebView2 control
// displays an error page automatically.
}
}
m_toolbar->SetItemEnabled(Toolbar::Item_CancelButton, false);
m_toolbar->SetItemEnabled(Toolbar::Item_ReloadButton, true);
return S_OK;
})
.Get(),
&m_navigationCompletedToken));
字符串
字符串输出参数是 LPWSTR
以 null 结尾的字符串。 请求者使用 CoTaskMemAlloc
提供字符串。 所有权将转让给请求方,由请求者使用 CoTaskMemFree
释放内存。
字符串输入参数是 LPCWSTR
以 null 结尾的字符串。 请求者确保字符串在同步函数请求的持续时间内有效。 如果接收方必须在函数请求完成后将值存储到某个点,则接收方必须提供字符串值的关联副本。
URI 和 JSON 分析
各种方法提供或接受 URI 和 JSON 作为字符串。 使用首选库来分析和生成字符串。
如果 WinRT 可用于你的应用,则可以使用 RuntimeClass_Windows_Data_Json_JsonObject
和 IJsonObjectStatics
方法来分析或生成 JSON 字符串,或 RuntimeClass_Windows_Foundation_Uri
和 IUriRuntimeClassFactory
方法来分析和生成 URI。 这两种方法都适用于 Win32 应用。
如果使用 IUri
和 CreateUri
来分析 URI,则可能希望使用以下 URI 创建标志,使 CreateUri
行为与 WebView2 控件中的 URI 分析更匹配:
Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME | Uri_CREATE_NO_DECODE_EXTRA_INFO
另请参阅
- Win32 应用中的 WebView2 入门 - WebView2 Win32 C/C++。
- WebView2 API 参考