このページについて

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
のように定義する必要がある。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

管理人/副管理人のみ編集できます