; Example script, showing the usage of COM Event functions.
; Requires at least AutoIt beta version 3.1.1.104 !
;
; See also: http://msdn.microsoft.com/workshop/browser/webbrowser/reference/objects/internetexplorer.asp

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

#include "GUIConstantsEx.au3"

Global $hGUIEdit, $hGUIProg

Example()
Exit ; End of our Demo.

Func Example()
    Local $hGUIMain = GUICreate("Event Test", 600, 500)
    $hGUIEdit = GUICtrlCreateEdit("Test Log:" & @CRLF, 10, 20, 580, 400)
    $hGUIProg = GUICtrlCreateProgress(10, 5, 580, 10)
    Local $hGUIExit = 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(0, "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 $msg
    While 1
        $msg = GUIGetMsg()
        If $msg = $GUI_EVENT_CLOSE Or $msg = $hGUIExit 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/workshop/browser/webbrowser/reference/objects/webbrowser.asp
Func IEEvent_BeforeNavigate($sURL, $Flags, $TargetFrameName, $PostData, $Headers, $Cancel)
    ;   Note: the declaration is different from the one on MSDN.
    GUICtrlSetData($hGUIEdit, "BeforeNavigate: " & $sURL & " Flags: " & $Flags & " tgframe: " & $TargetFrameName & " Postdat: " & $PostData & " Hdrs: " & $Headers & " canc: " & $Cancel & @CRLF, "append")
EndFunc   ;==>IEEvent_BeforeNavigate

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

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

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

Func IEEvent_DownloadComplete()
    GUICtrlSetData($hGUIEdit, "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($hGUIEdit, "IE has finished loading URL: " & $sURL & @CRLF, "append")
EndFunc   ;==>IEEvent_NavigateComplete

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