; Example script, showing the usage of COM Event functions.
;
; See also: http://msdn.microsoft.com/en-us/library/aa768400.aspx

; We use a very simple GUI to show the results of our Events.

#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>

Global $g_idGUIEdit, $g_idGUIProg

Example()
Exit ; End of our Demo.

Func Example()
        Local $hGUIMain = GUICreate("Event Test", 600, 500)
        $g_idGUIEdit = GUICtrlCreateEdit("Test Log:" & @CRLF, 10, 20, 580, 400)
        $g_idGUIProg = GUICtrlCreateProgress(10, 5, 580, 10)
        Local $idGUIExit = GUICtrlCreateButton(" Close ", 250, 450, 80, 30)
        GUISetState() ;Show GUI

        ; We prepare the Internet Explorer as our test subject
        Local $oIE = ObjCreate("InternetExplorer.Application.1")
        With $oIE
                .Visible = 1
                .Top = (@DesktopHeight - 400) / 2
                .Height = 400 ; Make it a bit smaller than our GUI.
                .Width = 600
                .Silent = 1 ; Don't show IE's dialog boxes
                Local $hIEWnd = HWnd(.hWnd) ; Remember the Window, in case user decides to close it
        EndWith

        ; We choose for a specific Internet Explorer interface 'DWebBrowserEvents' because the IE is subject
        ; to modifications by e.g. Visual Studio and Adobe Acrobat Reader. If you have IE-plugins installed,
        ; AutoIt might not be able to find the correct interface automatically.
        Local $oEventObject = ObjEvent($oIE, "IEEvent_", "DWebBrowserEvents")
        If @error Then
                MsgBox($MB_OK, "AutoIt COM Test", _
                                "ObjEvent: Can't use event interface 'DWebBrowserEvents'. Error code: " & Hex(@error, 8))
                Exit
        EndIf

        ; Now starting to load an example Web page.
        Local $sURL = "http://www.AutoItScript.com/"
        $oIE.Navigate($sURL)
        Sleep(1000) ; Give it some time to load the web page

        GUISwitch($hGUIMain) ; Switch back to our GUI in case IE stole the focus

        ; Waiting for user to close the GUI.
        Local $iMsg
        While 1
                $iMsg = GUIGetMsg()
                If $iMsg = $GUI_EVENT_CLOSE Or $iMsg = $idGUIExit Then ExitLoop
        WEnd

        $oEventObject.Stop ; Tell IE we don't want to receive events.
        $oEventObject = 0 ; Kill the Event Object
        If WinExists($hIEWnd) Then $oIE.Quit ; Close IE Window
        $oIE = 0 ; Remove IE from memory (not really necessary).

        GUIDelete() ; Remove GUI
EndFunc   ;==>Example

; A few Internet Explorer Event Functions
; See also: http://msdn.microsoft.com/en-us/library/aa768400.aspx
Func IEEvent_BeforeNavigate($sURL, $iFlags, $sTargetFrameName, $dPostData, $sHeaders, $bCancel)
        ;   Note: the declaration is different from the one on MSDN.
        GUICtrlSetData($g_idGUIEdit, "BeforeNavigate: " & $sURL & " Flags: " & $iFlags & " tgframe: " & $sTargetFrameName & " Postdat: " & $dPostData & " Hdrs: " & $sHeaders & " canc: " & $bCancel & @CRLF, "append")
EndFunc   ;==>IEEvent_BeforeNavigate

Func IEEvent_ProgressChange($iProgress, $iProgressMax)
        If $iProgressMax > 0 Then
                GUICtrlSetData($g_idGUIProg, ($iProgress * 100) / $iProgressMax)
        EndIf
EndFunc   ;==>IEEvent_ProgressChange

Func IEEvent_StatusTextChange($sText)
        GUICtrlSetData($g_idGUIEdit, "IE Status text changed to: " & $sText & @CRLF, "append")
EndFunc   ;==>IEEvent_StatusTextChange

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

Func IEEvent_DownloadComplete()
        GUICtrlSetData($g_idGUIEdit, "IE has finished a navigation operation" & @CRLF, "append")
EndFunc   ;==>IEEvent_DownloadComplete

Func IEEvent_NavigateComplete($sURL)
        ;   Note: the declaration is different from the one on MSDN.
        GUICtrlSetData($g_idGUIEdit, "IE has finished loading URL: " & $sURL & @CRLF, "append")
EndFunc   ;==>IEEvent_NavigateComplete

Func IEEvent_($sEventName)
        ; This is an optional event function to catch non-defined events.
        ; The parameter contains the name of the event being called.
        GUICtrlSetData($g_idGUIEdit, "Uncatched event: " & $sEventName & @CRLF, "append")
EndFunc   ;==>IEEvent_