访问WebView2新打开的窗口

问题描述

如果我运行window.open("url"),即使它是Edge WebView2,它也会在新的弹出窗口中打开url。它将仅具有默认的Windows标题栏和只读URL栏。我需要通过window.open("url")在新的弹出窗口中完全从WebView打开url。

有什么办法可以从我的程序访问原始WebView2子窗口的窗口?通过访问,我的意思是注入脚本,并在注入后获得js响应。

或者,至少,也许可以使用一些预先注入的脚本(例如window.open("http://google.com -javascript: alert(5)"))来打开url?


更新

找到了MSDN article,也许这就是我所需要的。试图理解这一点。

解决方法

是的,ICoreWebView2::add_NewWindowRequested事件使您可以拦截WebView2打开新窗口。

如果您在事件处理程序中不执行任何操作,或者不订阅事件,则将看到您所描述的新弹出窗口。在脚本中,返回值window.open连接到新打开的弹出窗口。但是在您的本机代码中,您无权访问或控制新打开的窗口。

或者您可以在NewWindowRequested事件的args上将Handled property设置为true,并且不会创建新窗口。如果您要防止打开窗口,或者要将新的窗口打开发送到默认浏览器或其他位置,则此功能很有用。在脚本中,window.open的返回值为空。

或者您可以通过NewWindow property提供自己的ICoreWebView2。在这种情况下,您负责并选择如何以某种方式托管该ICoreWebView2。您作为NewWindow提供的ICoreWebView2将成为新窗口导航的目标,并通过脚本备份到window.open调用的返回值。

由于获取新的WebView2可能需要异步方法调用,因此可以在事件args上使用GetDeferral方法来停止完成窗口请求的事件,直到稍后稍后在延迟上异步调用Complete。

您可以在示例应用程序中看到working sample of the add_NewWindowRequested event

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...