如何获取对 WebView2 中新窗口的引用?

Joh*_*nyL 2 c# webview2

假设我正在点击Flashscore网站上的一些网球比赛。弹出一个新窗口。我想捕获 WebView2 中的第二个窗口:

browser.CoreWebView2Ready += delegate
{ 
    browser.CoreWebView2.NewWindowRequested += OnNewWindowRequested;
};

private async void OnNewWindowRequested(object sender, CoreWebView2NewWindowRequestedEventArgs e)
{
    var newWindow = e.NewWindow; //null
}
Run Code Online (Sandbox Code Playgroud)

然而,newWindownull。同时,使用WindowFeatures,我可以获得新窗口的高度或宽度:

uint height = e.WindowFeatures.Height;
uint width = e.WindowFeatures.Width;
Run Code Online (Sandbox Code Playgroud)

如何捕获对第二个窗口的引用?

Dav*_*ney 8

NewWindowRequested 事件可以让您取消打开新窗口或用您自己的窗口替换该窗口,但您不能让 WebView2 为您打开一个新窗口并获取对该新窗口的引用。

NewWindowRequested事件场景:

  1. 在事件处理程序中不采取任何操作或不订阅。WebView2 将打开一个具有最小 UI 的新窗口,该窗口不受最终开发人员的控制。
  2. Handled事件参数的属性设置为true。取消打开新窗口。如果window.open是创建新窗口的内容,则返回值为null
  3. Handled将事件参数的属性设置为true,并使用该Uri属性在用户的默认浏览器中打开 URI,或者以其他方式处理 WebView2 外部的新窗口。
  4. Handled将事件参数的属性设置为true,并将NewWindow属性设置为您创建的新 CoreWebView2。如果window.open是创建新窗口的内容,则返回值是与您提供的 CoreWebView2 相对应的新窗口对象。您可以通过从 CoreWebView2Environment 类创建一个新的 CoreWebView2 来获取新的 CoreWebView2 ,或者如果您在 WPF、WinForms 或 WinUI 中使用 WebView2 元素,则可以创建一个新的 WebView2 元素并使用其 CoreWebView2 属性。

您可以在我们的示例应用程序中看到一些使用 NewWindowRequested 事件的示例。

  • 没有明确的 WebView2 API 可以实现这一点。您可以使用 ExecuteScriptAsync 注入 JavaScript,该 JavaScript 使用 MutationObserver https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver 来检测您喜欢的任何更改,然后使用 WebMessageReceived / chrome.webview.postMessage 来发布发生更改时从脚本到本机的消息。或者,如果您的意思是导航到新的 HTML 文档时,您可以使用 NavigationStarting 事件。 (2认同)