Private Sub CommandButton1_Click()
Dim objWMI As Object, objProcess As Object, objProcesses As Object
Set objWMI = GetObject("winmgmts://.")
Set objProcesses = objWMI.ExecQuery("Select * FROM Win32_Process Where Name = 'iexplore.exe'")
For Each objProcess In objProcesses
objProcess.Terminate
Next
Set objProcesses = Nothing
Set objWMI = Nothing
Unload WebForm
End Sub
在运行从基于Web的服务器检索数据的某些函数之前,尝试使用此方法关闭所有Explorer实例,但在尝试关闭具有多个选项卡的打开浏览器时遇到问题。如果用户只打开了一个IE窗口(一个选项卡),那么它就会关闭它并继续运行;如果这些用户有多个窗口单独打开(没有在一个窗口中打开标签),那么它关闭它们就好了并继续前进;但由于某种原因,如果一个窗口打开了多个选项卡,那么我得到运行时错误' -2147217406(80041002)':"未找到"。任何帮助解决这个问题的人都将不胜感激。
答案 0 :(得分:1)
不完全是你提出的问题,而是另一种使用PowerShell的方法,并且包含一个选项(从here关闭仅在IE打开超过X秒的时间窗口。
Sub Comesfast()
X2 = Shell("powershell.exe get-process iexplore | ? { ([DateTime]::Now - $_.StartTime).TotalSeconds -gt 05 } | stop-process", 1)
End Sub
答案 1 :(得分:1)
此问题是由IE处理标签的方式引起的。 IE有1个主要实例,每个选项卡都会创建新的进程iexplore。 因此,当主要主机实例关闭时,所有与选项卡相关的进程也将关闭。 它会导致代码出错,因为您枚举的集合是早期状态的状态快照,并且您尝试关闭不再存在的进程。这可以在TaskManager中观察到。
现在回答如何改进你的代码(当然,简单的错误恢复下一步也会有所帮助,但是如果用户打开了更多会话,那么在首次关闭的实例之后退出可能是不够的):
Private Sub CommandButton1_Click()
Dim objWMI As Object, objProcess As Object, objProcesses As Object
Do
Set objWMI = GetObject("winmgmts://.")
Set objProcesses = objWMI.ExecQuery("Select * FROM Win32_Process Where Name = 'iexplore.exe'")
If objProcesses.Count > 0 Then
For Each objProcess In objProcesses
objProcess.Terminate
Exit For
Next
End If
Loop While objProcesses.Count > 0
Set objProcesses = Nothing
Set objWMI = Nothing
Unload WebForm
End Sub