Win32 C++ WebView2 API 约定

支持的平台: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_EventNameremove_EventName 方法对订阅和取消订阅事件。 方法 add_EventName 采用事件处理程序委托接口,并将令牌作为输出参数返回 EventRegistrationToken 。 方法 remove_EventName 获取令牌 EventRegistrationToken 并取消订阅相应的事件订阅。

事件处理程序委托接口

事件处理程序委托接口的工作方式类似于异步方法完成的处理程序委托接口。 实现事件处理程序委托接口,并在 CoreWebView2 事件运行时发送回调。

每个事件处理程序委托接口都有一个 Invoke 方法,该方法具有发送方参数,后跟事件 args 参数。 发送方是为其订阅事件的 对象的实例。 event args 参数是一个接口,其中包含有关当前触发事件的信息。

例如,上的 NavigationCompletedICoreWebView2 事件具有 ICoreWebView2::add_NavigationCompletedICoreWebView2::remove_NavigationCompleted 方法对。 发送请求时,需要提供以前实现Invoke方法的 实例ICoreWebView2NavigationCompletedEventHandler

NavigationCompleted 事件运行时,将请求方法 Invoke

  • 第一个参数运行 事件 NavigationCompleted
  • 第二个参数包含有关导航是否成功完成等的信息。

与异步方法 completed 处理程序委托接口类似,请使用下列操作之一进行设置:

// 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_JsonObjectIJsonObjectStatics 方法来分析或生成 JSON 字符串,或 RuntimeClass_Windows_Foundation_UriIUriRuntimeClassFactory 方法来分析和生成 URI。 这两种方法都适用于 Win32 应用。

如果使用 IUriCreateUri 来分析 URI,则可能希望使用以下 URI 创建标志,使 CreateUri 行为与 WebView2 控件中的 URI 分析更匹配:

Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME | Uri_CREATE_NO_DECODE_EXTRA_INFO

另请参阅