; COMイベント関数使用法のサンプルスクリプト
; AutoIt beta バージョン 3.1.1.104 以降が必要!
;
; 参照: http://msdn.microsoft.com/workshop/browser/webbrowser/reference/objects/internetexplorer.asp

; イベント結果を表示するためにごく単純なGUIを使用
#include "GUIConstantsEx.au3"
$GUIMain=GUICreate              ( "Event Test",       600,500 )
$GUIEdit=GUICtrlCreateEdit      ( "Test Log:" & @CRLF,  10, 20, 580, 400)
$GUIProg=GUICtrlCreateProgress  (                       10,  5, 580,  10)
$GUIExit=GUICtrlCreateButton    ( " Close ",          250, 450, 80,  30)
GUISetState ()       ; GUI表示

; テスト用のInternet Explorerを用意
$oIE=ObjCreate("InternetExplorer.Application.1")
With $oIE
    .Visible=1
    .Top = (@DesktopHeight-400)/2
    .Height=400         ; GUIより少しだけ小さくする
    .Width=600
    .Silent=1           ; IEのダイアログボックスは非表示
    $IEWnd=HWnd(.hWnd)  ; 終了時のためにウィンドウを記録
EndWith

;Internet Explorerインターフェイスの'DWebBrowserEvents'を指定。これはIEはVisual Studioや
;Adobe Acrobat Readerによって変更されることがあるため。IEプラグインをインストールしている場合、
;AutoItは正しいインターフェイスを自動で見つけることができない。
$EventObject=ObjEvent($oIE,"IEEvent_","DWebBrowserEvents")
if @error then
   Msgbox(0,"AutoIt COM Test", _
    "ObjEvent: Can't use event interface 'DWebBrowserEvents'. Error code: " & hex(@error,8))
   exit
endif

; サンプルウェブページのロード開始
$URL = "http://www.AutoItScript.com/"
$oIE.Navigate( $URL )          
sleep(1000)             ; ウェブページロードのための時間

GUISwitch ( $GUIMain )  ; IEがフォーカスを奪っている場合を考えGUIにスイッチバック

; ユーザーがGUIを閉じるまで待機
While 1
   $msg = GUIGetMsg()
   If $msg = $GUI_EVENT_CLOSE or $msg = $GUIExit Then ExitLoop
Wend

$EventObject.Stop   ; IEにイベントを受け付けたくないことを通知
$EventObject=0      ; イベントオブジェクトを削除
If WinExists($IEWnd) then $oIE.Quit     ; IEウィンドウを閉じる
$oIE=0              ; メモリからIEを削除(必須ではない)

GUIDelete ()        ; GUI削除

exit                ; デモ終了

; いくつかのInternet Explorerイベント関数
; 参照: http://msdn.microsoft.com/workshop/browser/webbrowser/reference/objects/webbrowser.asp

Func IEEvent_BeforeNavigate($URL, $Flags, $TargetFrameName, $PostData, $Headers, $Cancel)
;   ノート: 宣言がMSDNのものとは異なる
    GUICtrlSetData ( $GUIEdit, "BeforeNavigate: " & $URL & " Flags: " & $Flags & " tgframe: " & $TargetFrameName & " Postdat: " & $PostData & " Hdrs: " & $Headers & " canc: " & $Cancel  & @CRLF  , "append" )
EndFunc

Func IEEvent_ProgressChange($Progress,$ProgressMax)
    If $ProgressMax > 0 Then
        GUICtrlSetData($GUIProg, ($Progress * 100) / $ProgressMax )
    EndIf
EndFunc

Func IEEvent_StatusTextChange($Text)
    GUICtrlSetData ( $GUIEdit, "IE Status text changed to: " & $Text & @CRLF  , "append" )
EndFunc

Func IEEvent_PropertyChange( $szProperty)
    GUICtrlSetData ( $GUIEdit, "IE Changed the value of the property: " & $szProperty & @CRLF  , "append" )
EndFunc

Func IEEvent_DownloadComplete()
    GUICtrlSetData ( $GUIEdit, "IE has finished a navigation operation" & @CRLF  , "append" )
EndFunc

Func IEEvent_NavigateComplete($URL)  
;   ノート: 宣言がMSDNのものとは異なる
    GUICtrlSetData ( $GUIEdit, "IE has finished loading URL: " & $URL & @CRLF  , "append" )
EndFunc

Func IEEvent_($EventName)  
; これは定義されていないイベントをキャッチするためのオプションのイベント関数
; パラメータは呼ばれたイベントの名前を格納している
    GUICtrlSetData ( $GUIEdit, "Uncatched event: " & $EventName & @CRLF  , "append" )
EndFunc