我有一个进度指示器实现为我的脚本(VbScript)启动的一个小的 IE 窗口。除了在 HTML 文件中嵌入脚本之外,我希望有一种方法来检测用户是否退出此窗口,以便我可以“清理”。
是否有任何内置方法,使用 VBScript(再次,真的希望不在 html 中嵌入脚本)来检测用户是否退出了这个 IE 窗口?目前,我正在尝试检查 iexplore.exe 是否不存在,但是由于此进度对话框的性质,这被证明是一项艰巨的任务,并且它带来了太多无法接受的风险。
我有一个进度指示器实现为我的脚本(VbScript)启动的一个小的 IE 窗口。除了在 HTML 文件中嵌入脚本之外,我希望有一种方法来检测用户是否退出此窗口,以便我可以“清理”。
是否有任何内置方法,使用 VBScript(再次,真的希望不在 html 中嵌入脚本)来检测用户是否退出了这个 IE 窗口?目前,我正在尝试检查 iexplore.exe 是否不存在,但是由于此进度对话框的性质,这被证明是一项艰巨的任务,并且它带来了太多无法接受的风险。
如果使用 CreateObject 的第二个参数,则可以编写脚本来响应 IE 事件。IE 公开了关闭窗口时触发的 onQuit 事件。确保指定 CreateObject 方法的 WScript 变体。本机 VBScript 不支持所需的第二个参数。
Set objIE = WScript.CreateObject("InternetExplorer.Application", "IE_")
' Set up IE and navigate to page
' ...
' Keep the script busy so it doesn't end while waiting for the IE event
' It will start executing inside the subroutine below when the event fires
Do While True
WScript.Sleep 1000
Loop
' Execute code when IE closes
Sub IE_onQuit
'Do something here
End Sub
您可以在此处通过更详尽的示例了解有关此方法的更多信息。这是一个很好的异步解决方案。
第二种方法使用 WMI 来启动 IE,这样您就可以直接访问正在运行的实例。当实例关闭时,对象引用变为空。
Const SW_NORMAL = 1
strCommandLine = "%PROGRAMFILES%\Internet Explorer\iexplore.exe"
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objProcessStartup = objWMIService.Get("Win32_ProcessStartup")
Set objStartupInformation = objProcessStartup.SpawnInstance_
objStartupInformation.ShowWindow = SW_NORMAL
objStartupInformation.Title = strUniqueTitle
Set objProcess = GetObject("winmgmts:root\cimv2:Win32_Process")
intReturn = objProcess.Create("cmd /k" & vbQuote & strCommandLine & vbQuote, null, objStartupInformation, intProcessID)
Set objEvents = objWMIService.ExecNotificationQuery( _
"SELECT * FROM __InstanceDeletionEvent " & _
"WHERE TargetInstance ISA 'Win32_Process' " & _
"AND TargetInstance.PID = '" & intProcessID & "'")
' The script will wait here until the process terminates and then execute any code below.
Set objReceivedEvent = objEvents.NextEvent
' Code below executes after IE closes
此解决方案使用 WMI 启动流程实例并返回其流程 ID。然后它使用 WMI 事件来监视进程是否结束。这在同步方法中,脚本执行将停止并等待该过程完成。这也可以通过该ExecNotificationQueryAsync
方法异步完成,但这种类型的脚本不太常见。