最終更新: twoflat1017 2012年10月16日(火) 09:41:45履歴
IEのイベント発火タイミングを知るべく、イベントを捕捉するコードとその結果から検討を行った。
- サンプルコードは、スクリプト実行の枠組みで定義したwsfファイルから呼ばれることを前提としている。したがって、そのままコピペした場合は正常に動作しない可能性がある。
- 結果は、Navigateメソッドで@ITのトップページにアクセスして得られたものである。
- IEはバージョン9である。
- すべてのイベントについての詳細はこの記事を参照。
Navigateメソッドで@ITのトップページにアクセスし、頃合いを見てIEを終了して得られたものである。とりあえず、生データ…。
"IE_OnVisible" "IE_PropertyChange" "IE_BeforeNavigate2" "IE_DownloadBegin" "IE_PropertyChange" "IE_CommandStateChange" "IE_CommandStateChange" "IE_StatusTextChange" "IE_StatusTextChange" "IE_ProgressChange" "IE_StatusTextChange" "IE_StatusTextChange" "IE_ProgressChange" "IE_StatusTextChange" "IE_FileDownload" "IE_StatusTextChange" "IE_DownloadComplete" "IE_StatusTextChange" "IE_StatusTextChange" "IE_DownloadBegin" "IE_SetSecureLockIcon" "IE_SetPhishingFilterStatus" "IE_StatusTextChange" "IE_SetSecureLockIcon" "IE_SetPhishingFilterStatus" "IE_CommandStateChange" "IE_TitleChange" "IE_NavigateComplete2" "IE_SetSecureLockIcon" "IE_WindowStateChanged" "IE_CommandStateChange" "IE_CommandStateChange" "IE_CommandStateChange" "IE_TitleChange" "IE_ProgressChange" "IE_ProgressChange" "IE_BeforeNavigate2" "IE_BeforeNavigate2" "IE_BeforeNavigate2" "IE_ProgressChange" "IE_ProgressChange" "IE_ProgressChange" "IE_TitleChange" "IE_PrivacyImpactedStateChange" "IE_ProgressChange" "IE_NavigateComplete2" "IE_CommandStateChange" "IE_CommandStateChange" "IE_ProgressChange" "IE_ProgressChange" "IE_StatusTextChange" "IE_DownloadComplete" "IE_TitleChange" "IE_DocumentComplete" "IE_NavigateComplete2" "IE_NavigateComplete2" "IE_TitleChange" "IE_DocumentComplete" "IE_DocumentComplete" "IE_ProgressChange" "IE_StatusTextChange" "IE_DocumentComplete" "IE_StatusTextChange" "IE_SetPhishingFilterStatus" "IE_CommandStateChange" "IE_CommandStateChange" "IE_CommandStateChange" "IE_ProgressChange" "IE_StatusTextChange" "IE_StatusTextChange" "IE_StatusTextChange" "IE_StatusTextChange" "IE_StatusTextChange" "IE_StatusTextChange" "IE_StatusTextChange" "IE_StatusTextChange" "IE_StatusTextChange" "IE_StatusTextChange" "IE_StatusTextChange" "IE_StatusTextChange" "IE_StatusTextChange" "IE_StatusTextChange" "IE_StatusTextChange" "Internet Explorerが閉じられました。"
この記事とこの記事をベースに作成した。
Option Explicit 'InternetExplorerオブジェクトを作成。第2引数にイベントのプリフィックスを指定。 Dim objIE Set objIE = WScript.CreateObject("InternetExplorer.Application", "IE_") 'VisibleプロパティをTrueにして可視状態にする objIE.Visible = True 'Navigateメソッドで@ITのトップページにアクセス objIE.Navigate "http://www.atmarkit.co.jp/index.html" '無限ループを回す。 Do WScript.Sleep 200 Loop 'This event is obsolete. Use the BeforeNavigate2 event instead. Sub IE_BeforeNavigate(browser, url, flags, target, postdata, headers, cancel) objLogFile.Write 1, "IE_BeforeNavigate" End Sub Sub IE_BeforeNavigate2(browser, url, flags, target, postdata, headers, cancel) objLogFile.Write 1, "IE_BeforeNavigate2" End Sub Sub IE_CommandStateChange(Command ,Enable) objLogFile.Write 1, "IE_CommandStateChange" End Sub Sub IE_DocumentComplete(browser, url) objLogFile.Write 1, "IE_DocumentComplete" End Sub Sub IE_DownloadBegin() objLogFile.Write 1, "IE_DownloadBegin" End Sub Sub IE_DownloadComplete() objLogFile.Write 1, "IE_DownloadComplete" End Sub Sub IE_FileDownload(ActiveDocument, Cancel) objLogFile.Write 1, "IE_FileDownload" End Sub 'This event is obsolete. Use the NavigateComplete2 event instead. Sub IE_NavigateComplete(browser, url) objLogFile.Write 1, "IE_NavigateComplete" End Sub Sub IE_NavigateComplete2(browser, url) objLogFile.Write 1, "IE_NavigateComplete2" End Sub Sub IE_NavigateError(browser, url, target, status, cancel) objLogFile.Write 1, "IE_NavigateError" End Sub Sub IE_NewProcess(lCauseFlag, pWB2, Cancel) objLogFile.Write 1, "IE_NewProcess" End Sub 'This event is obsolete. Use the NewWindow2 event instead. Sub IE_NewWindow(browser, Cancel) objLogFile.Write 1, "IE_NewWindow" End Sub Sub IE_NewWindow2(browser, Cancel) objLogFile.Write 1, "IE_NewWindow2" End Sub Sub IE_NewWindow3(browser, Cancel, dwFlags, bstrUrlContext, bstrUrl) objLogFile.Write 1, "IE_NewWindow3" End Sub Sub IE_OnFullScreen(FullScreen) objLogFile.Write 1, "IE_OnFullScreen" End Sub Sub IE_OnMenuBar(MenuBar) objLogFile.Write 1, "IE_OnMenuBar" End Sub 'OnQuitイベント Sub IE_OnQuit() objLogFile.Write 1, "Internet Explorerが閉じられました。" 'オブジェクトの破棄 Set objIE = Nothing WScript.Quit() 'スクリプトの終了 End Sub Sub IE_OnStatusBar(StatusBar) objLogFile.Write 1, "IE_OnStatusBar" End Sub Sub IE_OnTheaterMode(TheaterMode) objLogFile.Write 1, "IE_OnTheaterMode" End Sub Sub IE_OnToolBar(ToolBar) objLogFile.Write 1, "IE_OnToolBar" End Sub Sub IE_OnVisible(vVisible) objLogFile.Write 1, "IE_OnVisible" End Sub Sub IE_PrintTemplateInstantiation(browser) objLogFile.Write 1, "IE_PrintTemplateInstantiation" End Sub Sub IE_PrintTemplateTeardown(browser) objLogFile.Write 1, "IE_PrintTemplateTeardown" End Sub Sub IE_PrivacyImpactedStateChange(bPrivacyImpacted) objLogFile.Write 1, "IE_PrivacyImpactedStateChange" End Sub Sub IE_ProgressChange(nProgress , nProgressMax) objLogFile.Write 1, "IE_ProgressChange" End Sub Sub IE_PropertyChange(sProperty) objLogFile.Write 1, "IE_PropertyChange" End Sub Sub IE_RedirectXDomainBlocked(browser, url, RedirectURL, Frame, StatusCode) objLogFile.Write 1, "IE_RedirectXDomainBlocked" End Sub Sub IE_SetPhishingFilterStatus(PhishingFilterStatus) objLogFile.Write 1, "IE_SetPhishingFilterStatus" End Sub Sub IE_SetSecureLockIcon(SecureLockIcon) objLogFile.Write 1, "IE_SetSecureLockIcon" End Sub Sub IE_StatusTextChange(sText ) objLogFile.Write 1, "IE_StatusTextChange" End Sub Sub IE_ThirdPartyUrlBlocked(URL, dwCount) objLogFile.Write 1, "IE_ThirdPartyUrlBlocked" End Sub Sub IE_TitleChange(sText) objLogFile.Write 1, "IE_TitleChange" End Sub 'Not implemented. Sub IE_UpdatePageStatus() objLogFile.Write 1, "IE_UpdatePageStatus" End Sub 'Not implemented. Sub IE_WindowActivate() objLogFile.Write 1, "IE_WindowActivate" End Sub 'Not implemented. Sub IE_WindowMove() objLogFile.Write 1, "IE_WindowMove" End Sub 'Not implemented. Sub IE_WindowResize() objLogFile.Write 1, "IE_WindowResize" End Sub Sub IE_WindowStateChanged(dwFlags, dwValidFlagsMask) objLogFile.Write 1, "IE_WindowStateChanged" End Sub
たとえば、この記事やこの記事で紹介されているようなビジー状態で判定を行う方法では、IEが指定されたURLを読み込み終わるのを知ることができないケースがあった。それを知らずに、document.body.InnerHTML等の値の取得を行うとオブジェクトがありませんなどのエラーメッセージが出ることがある。回避するにはsleep等で待てば良いのであるが、読み込み、画面への展開に要する時間は環境依存(サイトの構成、PCのスペック、通信速度、などなど)が普通で、正確に見積もることはおそらく不可能である。そこで、イベント発火を捕捉することができれば、待ち時間を予測することもポーリングすることも不要になり、プログラムの汎用性も向上する。
イベント発火を捕捉するメソッドを追加する際は、マイクロソフトの記事のeventを見て、引数の数等を間違わないように定義する必要がある。そうしないと、定義した関数がイベント発火時に呼ばれない結果となる。例えばDocumentCompleteイベントの場合…
Sub IE_DocumentComplete()'←引数がない ゴニョゴニョ End Subと定義するとイベント発生しているにもかかわらず関数が呼ばれない。そこで、
Sub IE_DocumentComplete(browser, url)'←引数がある ゴニョゴニョ End Subのように定義する必要がある。
コメントをかく