VB2019如何实现点击按钮关闭Chrome指定打开的标签页
VB.net 精准关闭Chrome指定标签页实现方案
你当前直接调用Process.Start启动Chrome的写法无法实现精准关闭单个标签:Chrome默认采用单进程多标签架构,你通过代码唤起的chrome.exe进程会在启动后立刻将打开的标签页托管给已运行的Chrome主进程,此时如果直接kill这个启动进程,要么没有任何效果,要么会直接关闭整个Chrome浏览器,完全无法定位到你自己打开的单个标签。
最稳定的实现方式是借助Chrome自带的远程调试能力,给你程序唤起的Chrome实例指定独立调试端口,后续通过本地调试接口精准关闭目标标签,完全不会影响用户自行打开的其他Chrome标签页。
完整实现代码
首先在窗体类中定义全局变量,存储唤起的Chrome进程对象、目标标签的唯一ID,以及你要使用的独立调试端口:
Public Class FrmAgenda ' 存储程序自身唤起的Chrome进程 Private chromeProcess As Process ' 存储程序打开的目标标签页ID Private targetTabId As String = String.Empty ' 定义独立调试端口,避开其他程序常用端口即可 Private Const ChromeDebugPort As String = "9223" Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim weblink As String = "https://www.google.com" ' 配置Chrome启动参数:开启指定端口的远程调试、指定独立用户数据目录避免和用户正常使用的Chrome冲突 Dim chromeStartInfo As New ProcessStartInfo("chrome.exe") chromeStartInfo.Arguments = $"--remote-debugging-port={ChromeDebugPort} --user-data-dir=""{Path.Combine(Application.StartupPath, "ChromeTempData")}"" {weblink}" chromeProcess = Process.Start(chromeStartInfo) ' 等待Chrome完成初始化,时长可根据设备性能调整 Threading.Thread.Sleep(1200) ' 调用Chrome本地调试接口拉取所有标签页信息 Dim webClient As New Net.WebClient() Dim tabListJson As String = webClient.DownloadString($"http://127.0.0.1:{ChromeDebugPort}/json") ' 解析返回的JSON数据匹配目标标签 Dim jsSerializer As New Script.Serialization.JavaScriptSerializer() Dim tabList As List(Of Object) = jsSerializer.Deserialize(Of List(Of Object))(tabListJson) For Each tab In tabList Dim tabInfo As Dictionary(Of String, Object) = CType(tab, Dictionary(Of String, Object)) If tabInfo("url").ToString().StartsWith(weblink) Then targetTabId = tabInfo("id").ToString() Exit For End If Next End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click ' 校验标签是否存在 If String.IsNullOrEmpty(targetTabId) OrElse (chromeProcess IsNot Nothing AndAlso chromeProcess.HasExited) Then MsgBox("目标标签页已关闭或不存在") Return End If Try Dim webClient As New Net.WebClient() ' 调用调试接口关闭指定ID的标签页 webClient.DownloadString($"http://127.0.0.1:{ChromeDebugPort}/json/close/{targetTabId}") ' 清空已存储的标签ID,避免重复操作 targetTabId = String.Empty Catch ex As Exception MsgBox($"关闭标签失败:{ex.Message}") End Try End Sub End Class
配置&使用说明
- 代码中用到的
JavaScriptSerializer需要先给项目添加对应引用:右键项目资源管理器中的你的项目 -> 选择「添加」->「引用」-> 在程序集列表中找到System.Web.Extensions勾选后确认即可 - 启动参数中的
--user-data-dir是给程序唤起的Chrome指定独立的用户配置存储目录,完全和用户平时自己打开的Chrome配置隔离,不会串数据、也不会因为Chrome已经在运行导致调试端口失效 - 等待Chrome启动的
Sleep时长可以根据实际运行设备的性能调整,只要保证调用接口时Chrome已经完成初始化即可 - 如果担心匹配到用户之前打开的同网址标签,可以在Button1打开的网址后面拼接一个自定义唯一参数(比如
?myapp_tag=随机唯一标识),匹配标签时找带这个唯一参数的地址即可,100%不会关错页面 - 不要用发送
Ctrl+W快捷键、找子窗口句柄发送关闭消息的方案,这类方案强依赖窗口焦点,只要用户在点击Button2前切了其他窗口,就会关错内容,稳定性极差
内容的提问来源于stack exchange,提问作者Daniel Felipe Nery Tondo
相关产品推荐
相关产品推荐

