2012-06-14 37 views
1

我有一個進度指示器,作爲我的腳本(VbScript)啓動的小型IE窗口實現。除了在HTML文件中嵌入腳本之外,我希望能夠檢測用戶是否退出此窗口,以便「清理」。用於檢測用戶是否退出/退出Internet Explorer窗口的VBScript

是否有任何內置的方式,使用VBScript(再次,真的希望不在HTML中嵌入腳本),檢測用戶是否已退出此IE窗口?目前,我正在嘗試檢查iexplore.exe是否存在,但由於此進度對話的性質,這被證明是一項艱鉅的任務,並且存在太多風險以致無法接受。

+0

您是否通過Windows Script Host Shell('WScript.Shell'),通過CreateObject或其他方式啓動IE? – AutomatedChaos

+0

我通過CreateObject – JohnZaj

+0

@Jaguar推出它:因爲我問了太多無趣的問題,關於如何與我困在一塊笨拙的代碼進行交互。我會試着編輯這個問題,讓它看起來比實際上更有趣。我承認這個不是獎。 – JohnZaj

回答

3

如果您使用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 

您可以瞭解更多關於此方法具有一個更加詳盡的例子here。這是一個很好的異步解決方案。

第二種方法使用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方法異步完成,但這種類型的腳本不太常見。

+0

偉大的迴應Nilpo。解決方案編號1是最乾淨的,所以我會從那裏開始。不幸的是,我不能讓OnQuit只使用WScript.CreateObject(..,「IE_」)和聲明IE_onQuit()來觸發。如果涉及某些「工作」,我只能觸發,例如內部帶有Wscript.Sleep的循環。即使這似乎與時間有關。我會做我的研究,看看我能學到什麼,但我可能需要你的幫助。編輯:好吧,我想我明白 - WScript必須「做」一些東西。需要弄清楚這與我的腳本的其餘部分是否相符。 – JohnZaj

+0

你是對的。由於該腳本是異步執行的,因此需要創建一個「無限循環」,以便在從Internet Explorer收到事件之前阻止腳本退出。否則,腳本在到達它可以執行的最後一個命令時退出。我爲我的示例添加了一個簡單的循環。 – Nilpo

+0

我希望他們已經命名這個'OnClose'。我感到印象這個事件只有當用戶採取行動關閉它(通過文件|關閉或單擊X /關閉按鈕)纔會觸發。仍然是好東西,我仍然在使用這個解決方案,但是我不能區分表格關閉,因爲腳本成功完成,或者用戶主動選擇退出。 – JohnZaj