1

我有一个进度指示器实现为我的脚本(VbScript)启动的一个小的 IE 窗口。除了在 HTML 文件中嵌入脚本之外,我希望有一种方法来检测用户是否退出此窗口,以便我可以“清理”。

是否有任何内置方法,使用 VBScript(再次,真的希望不在 html 中嵌入脚本)来检测用户是否退出了这个 IE 窗口?目前,我正在尝试检查 iexplore.exe 是否不存在,但是由于此进度对话框的性质,这被证明是一项艰巨的任务,并且它带来了太多无法接受的风险。

4

1 回答 1

4

如果使用 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方法异步完成,但这种类型的脚本不太常见。

于 2012-06-14T14:20:42.457 回答