我有一個進度指示器,作爲我的腳本(VbScript)啓動的小型IE窗口實現。除了在HTML文件中嵌入腳本之外,我希望能夠檢測用戶是否退出此窗口,以便「清理」。用於檢測用戶是否退出/退出Internet Explorer窗口的VBScript
是否有任何內置的方式,使用VBScript(再次,真的希望不在HTML中嵌入腳本),檢測用戶是否已退出此IE窗口?目前,我正在嘗試檢查iexplore.exe是否存在,但由於此進度對話的性質,這被證明是一項艱鉅的任務,並且存在太多風險以致無法接受。
我有一個進度指示器,作爲我的腳本(VbScript)啓動的小型IE窗口實現。除了在HTML文件中嵌入腳本之外,我希望能夠檢測用戶是否退出此窗口,以便「清理」。用於檢測用戶是否退出/退出Internet Explorer窗口的VBScript
是否有任何內置的方式,使用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
您可以瞭解更多關於此方法具有一個更加詳盡的例子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
方法異步完成,但這種類型的腳本不太常見。
偉大的迴應Nilpo。解決方案編號1是最乾淨的,所以我會從那裏開始。不幸的是,我不能讓OnQuit只使用WScript.CreateObject(..,「IE_」)和聲明IE_onQuit()來觸發。如果涉及某些「工作」,我只能觸發,例如內部帶有Wscript.Sleep的循環。即使這似乎與時間有關。我會做我的研究,看看我能學到什麼,但我可能需要你的幫助。編輯:好吧,我想我明白 - WScript必須「做」一些東西。需要弄清楚這與我的腳本的其餘部分是否相符。 – JohnZaj
你是對的。由於該腳本是異步執行的,因此需要創建一個「無限循環」,以便在從Internet Explorer收到事件之前阻止腳本退出。否則,腳本在到達它可以執行的最後一個命令時退出。我爲我的示例添加了一個簡單的循環。 – Nilpo
我希望他們已經命名這個'OnClose'。我感到印象這個事件只有當用戶採取行動關閉它(通過文件|關閉或單擊X /關閉按鈕)纔會觸發。仍然是好東西,我仍然在使用這個解決方案,但是我不能區分表格關閉,因爲腳本成功完成,或者用戶主動選擇退出。 – JohnZaj
您是否通過Windows Script Host Shell('WScript.Shell'),通過CreateObject或其他方式啓動IE? – AutomatedChaos
我通過CreateObject – JohnZaj
@Jaguar推出它:因爲我問了太多無趣的問題,關於如何與我困在一塊笨拙的代碼進行交互。我會試着編輯這個問題,讓它看起來比實際上更有趣。我承認這個不是獎。 – JohnZaj