Newbiefrage: IE - UDF

  • Hallo an alle,
    ich bin erst seit kurzem auf AutiIt gestoßen.
    Dank peethebee, der im Chip-Forum einen Post zu Autohotkey hinterlassen hat.
    Dafür werde ich ihn in mein nächstes Gutenachtgebet miteinbeziehen ;)
    Merci nochmals.
    Ich finde AutoIt und die Möglichkeiten echt faszinierend und hier ist eine super Quelle zum stöbern. Kompliment.
    Ich breche mir schon seit gestern mit einer Funktion aus der IE-UDF was ab. Irgenwo habe ich ein Verständnisproblem.
    Mir ist noch nicht ganz klar, wie ich einen Handle zum aktuellen Fenster des IE bekomme. Ich benutze zwar Maxthon, aber der setzt auf der IE-Engine auf. Da ich weder eine neue Seite aufmachen möchte, mich noch mit -IEattach auf einen konkrete Seite beziehen möchte, dachte ich das mit Winhandle lösen zu können.

    #include <IE.au3>
    Dim $uRL, $oHandle

    AutoItSetOption("WinTitleMatchMode", 4)
    $oHandle = WinGetHandle("explorer")

    $uRL = _IEPropertyGet ($oHandle, "locationurl")

    MsgBox(0, "Aktuelle Seite", $uRL )

    Obwohl $oHandle einen gültigen Handle zurückgibt, bekomme ich von der Funktion _IEPropertyGet die Fehlermeldung: $_IEStatus_InvalidDataType zurück. Tja da hänge ich nun, da ich noch nicht verstehe was an dem Handle falsch sein könnte im Vergleich z.B. zu dem Handle der von der Funktion _IEattach zurückgegeben wird.
    Es soll nicht einfach funktonieren - ich möchte es verstehen. Für die Cracks unter euch sicher ein Klacks.
    Vielen Dank schon mal.
    Euer
    Zebulon

    Edit: Mit dem geöffnetne M$ IE habe ich es auch schon versucht. Und mit einigen anderen Parametern zu WinGetHandle z.B. classname=explorer. Die Fehlermeldung ist die gleiche. Es muß am Zusammenspiel von WinGetHandle und _IEPropertyGet liegen. Grübel....

    Einmal editiert, zuletzt von Zebulon (13. Dezember 2006 um 18:21)

    • Offizieller Beitrag

    Hi und :willkommen:!

    Zitat

    Original von Zebulon
    Hallo an alle,
    ich bin erst seit kurzem auf AutiIt gestoßen.
    Dank peethebee, der im Chip-Forum einen Post zu Autohotkey hinterlassen hat.
    Dafür werde ich ihn in mein nächstes Gutenachtgebet miteinbeziehen ;)
    Merci nochmals.


    Schön, dass du zu uns gefunden hast - sonst hätte ich auch da umsonst gespammt ;)

    Zitat


    Ich finde AutoIt und die Möglichkeiten echt faszinierend und hier ist eine super Quelle zum stöbern. Kompliment.


    Danke! Freut uns natürlich alle, das Lob. Und AutoIt ist natürlich einfach nur klasse ;)


    Ich kenne mich mit der IE.au3 nicht besonders gut aus, aber ich kann mir schon vorstellen, dass Maxthon kein absolut reines IE-Objekt verwendet, sondern da evtl. reinpfuscht.
    Daher würde ich dein Skript mal auf ein IE-Fenster ansetzen, ob es da klappt.
    Wenn man von dem ganzen Vorgang nichts sehen soll, dann kannst du es auch direkt über ein verstecktes IE-Fenster machen, der ist ja sowieso installiert, oder?
    Andernfalls müssen wir noch mal nachdenken ;)

    Zitat


    Vielen Dank schon mal.
    Euer
    Zebulon

    peethebee

  • Hi Zebulon,

    du hast da einen etwas unkonventionellen Weg genommen ;)
    Versuche es mal so:

    [autoit]


    #include <IE.au3>
    Dim $sURL, $oIE

    [/autoit][autoit][/autoit][autoit]

    $oIE = _IEAttach("Google")
    $sURL = _IEPropertyGet ($oIE, "locationurl")
    MsgBox(0, "Aktuelle Seite", $sURL )

    [/autoit]

    einfach den Internet Explorer bzw. Maxthon starten und Google aufrufen. Anschließend das Skript starten. Ich kenne Maxthon zwar nicht, aber ich gehe mal davon aus die COM-Objekte genauso zur Verfügung stehen.

    Einmal editiert, zuletzt von jonk (13. Dezember 2006 um 18:33)

  • Hallo Jonk,

    merci für Deine Antwort.

    > $oIE = _IEAttach("Google")

    genau da liegt mein Problem. Ich möchte die URL im aktuellen Fenster des Maxthon auslesen. (Du hast Recht. Die COM-Objekte des IE stehe zur Verfügung)
    Wenn ich nun mit _IEAttach arbeite, muß ich mich auf eine URL beziehen. Das möchte ich aber nicht. Lasse ich bei _IEAttach den Parameter weg, gebe nur " " ein, dann wird der erste Tabreiter von links ausgelesen aber nicht der aktuell offene.
    Maxthon arbeitet im Gegensatz zu IE6 mit Tab-Reitern, wie Version 7 oder FF.

    bis später - ich werde jetzt erst mal was für mein leibliches Wohl tun.

    Cu
    Zebulon

  • hmm, Maxthon zu automatisieren dürfte nicht einfach werden, wenn es überhaupt geht. Eigene COM-Objekte scheinen nicht installiert zu werden.
    Mit folgenden Skript habe ich zumindest die jeweilige Tab-URL auslesen können.

    Spoiler anzeigen
    [autoit]


    #include <IE.au3>
    Opt("WinTitleMatchMode",4)
    $aTitle = StringSplit(WinGetTitle("Maxthon"),"-")
    $oMaxth = _MaxthonAttach(StringStripWS($aTitle[1],3), 1,"embedded")
    $uRL = _IEPropertyGet ($oMaxth, "locationurl")
    MsgBox(0, "Aktuelle Seite", $uRL )

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Function Name: _MaxthonAttach
    ; Description: Attach to the first existing instance of Internet Explorer where the
    ; search string sub-string matches based on the selected mode.
    ; Parameter(s): $s_string - String to search for (for "embedded" or "dialogbox", use Title sub-string or HWND of window)
    ; $s_mode - Optional: specifies search mode
    ; Title = (Default) browser title
    ; URL = url of the current page
    ; Text = text from the body of the current page
    ; HTML = html from the body of the current page
    ; HWND = hwnd of the browser window
    ; Embedded = title sub-string or hwnd of the window embedding the control
    ; DialogBox = title sub-string or hwnd of modal/modeless dialogbox
    ; Requirement(s): AutoIt3 Beta with COM support (post 3.1.1)
    ; On Success - Returns an object variable pointing to the IE Window Object
    ; On Failure - Returns 0 and sets @ERROR
    ; @ERROR - 0 ($_IEStatus_Success) = No Error
    ; - 5 ($_IEStatus_InvalidValue) = Invalid Value
    ; - 7 ($_IEStatus_NoMatch) = No Match
    ; @Extended - Contains invalid parameter number
    ; Author(s): Dale Hohm and some changes by jonk :)
    ;
    ;===============================================================================
    ;
    Func _MaxthonAttach($s_string ,$iTabIndex, $s_mode = "Title")
    $s_mode = StringLower($s_mode)
    Local $o_Shell = ObjCreate("Shell.Application")
    Local $o_ShellWindows = $o_Shell.Windows (); collection of all ShellWindows (IE and File Explorer)
    Local $h_control, $oResult

    ; Embedded browser controls and modal/modeless dialogboxes are not
    ; included in ShellWindow collection so handle them seperately
    If $s_mode = "embedded" Or $s_mode = "dialogbox" Then
    ; Example:
    ; Run example in helpfile for GuiControlCreateObj first then:
    ; $oIE = _IEAttach("Window Title", "embedded")
    ; _IEClickLinkByText($oIE, "AutoIt V3")
    Local $iWinTitleMatchMode = 4;Opt("WinTitleMatchMode")
    Opt("WinTitleMatchMode", 2)
    $h_control = ControlGetHandle($s_string, "", "Internet Explorer_Server"&$iTabIndex)
    $oResult = __IEControlGetObjFromHWND($h_control)
    Opt("WinTitleMatchMode", $iWinTitleMatchMode)
    If IsObj($oResult) Then
    SetError($_IEStatus_Success)
    Return $oResult
    Else
    __IEErrorNotify("Warning", "_IEAttach", "$_IEStatus_NoMatch")
    SetError($_IEStatus_NoMatch, 1)
    Return 0
    EndIf
    EndIf

    For $o_window In $o_ShellWindows

    $h_control = ControlGetHandle(_IEPropertyGet($o_window, "hwnd"), "", "Internet Explorer_Server"&$iTabIndex)
    If Not @error Then
    Switch $s_mode
    Case "title"
    If StringInStr($o_window.document.title, $s_string) > 0 Then
    SetError($_IEStatus_Success)
    Return $o_window
    EndIf
    Case "url"
    If StringInStr($o_window.LocationURL, $s_string) > 0 Then
    SetError($_IEStatus_Success)
    Return $o_window
    EndIf
    Case "text"
    If StringInStr($o_window.document.body.innerText, $s_string) > 0 Then
    SetError($_IEStatus_Success)
    Return $o_window
    EndIf
    Case "html"
    If StringInStr($o_window.document.body.innerHTML, $s_string) > 0 Then
    SetError($_IEStatus_Success)
    Return $o_window
    EndIf
    Case "hwnd"
    If _IEPropertyGet($o_window, "hwnd") = $s_string Then
    SetError($_IEStatus_Success)
    Return $o_window
    EndIf
    Case Else
    ; Invalid Mode
    __IEErrorNotify("Error", "_IEAttach", "$_IEStatus_InvalidValue", "Invalid Mode Specified")
    SetError($_IEStatus_InvalidValue, 2)
    Return 0
    EndSwitch
    EndIf
    Next
    __IEErrorNotify("Warning", "_IEAttach", "$_IEStatus_NoMatch")
    SetError($_IEStatus_NoMatch, 1)
    Return 0
    EndFunc ;==>_IEAttach

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    EDIT:
    gespoilert :)

    Einmal editiert, zuletzt von jonk (13. Dezember 2006 um 21:15)

  • Hallo Meger,

    dein Scriptvorschlag gibt bei Maxthon den ersten tab zurück.
    Nicht den aktuellen.
    Ich probiere auch schon die ganze ZEIT:

    vg
    ZEBULON

    Einmal editiert, zuletzt von Zebulon (14. Dezember 2006 um 22:40)