如何通过VB.Net的WebView2控件操作新打开的窗口?
解决WebView2访问新窗口触发PDF下载的方案
核心思路
WebView2的CoreWebView2.NewWindowRequested事件可捕获window.open创建的新窗口,通过该事件获取新窗口的WebView2实例,即可在新窗口中执行JS操作触发PDF下载。
具体实现步骤
- 注册NewWindowRequested事件
在WebView2初始化完成后(比如CoreWebView2InitializationCompleted事件回调中),注册新窗口请求事件:
AddHandler wv.CoreWebView2.NewWindowRequested, AddressOf CoreWebView2_NewWindowRequested
- 捕获新窗口实例
实现事件处理方法,取消默认弹窗行为,获取新窗口的CoreWebView2对象,并绑定导航完成事件:
Private Sub CoreWebView2_NewWindowRequested(sender As Object, e As CoreWebView2NewWindowRequestedEventArgs) ' 取消系统默认的新窗口打开逻辑 e.Handled = True ' 创建新的WebView2实例关联到请求的新窗口 Dim newWebView As New WebView2() e.NewWindow = newWebView.CoreWebView2 ' 监听新窗口的导航完成事件,用于后续操作 AddHandler newWebView.CoreWebView2.NavigationCompleted, AddressOf NewWindow_NavigationCompleted End Sub
- 新窗口加载完成后触发下载
在新窗口页面加载完毕后,执行JavaScript点击PDF下载按钮:
Private Async Sub NewWindow_NavigationCompleted(sender As Object, e As CoreWebView2NavigationCompletedEventArgs) Dim newCoreWebView = DirectCast(sender, CoreWebView2) If e.IsSuccess Then ' 替换为新窗口中PDF下载按钮的实际选择器(比如ID或CSS选择器) Await newCoreWebView.ExecuteScriptAsync("document.querySelector('#pdfDownloadBtn').click();") End If End Sub
- 自定义下载行为(可选)
若需指定下载路径或监听进度,注册DownloadStarting事件:
AddHandler wv.CoreWebView2.DownloadStarting, AddressOf CoreWebView2_DownloadStarting
实现事件处理逻辑:
Private Sub CoreWebView2_DownloadStarting(sender As Object, e As CoreWebView2DownloadStartingEventArgs) ' 设置自定义保存路径 e.ResultFilePath = "C:\YourDownloadPath\magazine.pdf" ' 监听下载进度变化 AddHandler e.DownloadOperation.BytesReceivedChanged, AddressOf DownloadProgress_Changed End Sub Private Sub DownloadProgress_Changed(sender As Object, e As Object) Dim downloadOp = DirectCast(sender, CoreWebView2DownloadOperation) ' 输出进度示例,可替换为UI更新逻辑 Console.WriteLine($"下载进度: {downloadOp.BytesReceived}/{downloadOp.TotalBytesToReceive}") End Sub
注意事项
- 需确认新窗口中PDF按钮的正确选择器,可通过浏览器开发者工具查看元素的ID或CSS选择器。
- 所有事件注册需在WebView2的
CoreWebView2初始化完成后执行,避免空引用异常。 - 确保新窗口继承原WebView2的会话状态(如Cookie、登录信息),否则可能无法访问需要权限的PDF资源。
内容的提问来源于stack exchange,提问作者schlebe
相关产品推荐
相关产品推荐

