Frage zu WinGetHandle

  • Hallo,
    ich habe da ein kleines Problem mit dem "WinGetHandle"-Befehl.
    Hier zuerst ein kleines Beispilscript:

    ; Optionen für dieses Script festlegen.
    Opt("WinTitleMatchMode", 4)

    $WHandle = WinGetHandle($Fenster_Titel, $Fenster_Text)
    WinWait($WHandle, 10)
    WinActivate($WHandle)
    WinWaitActive($WinHandle, 5)

    If @error Then
    BlockInput(0)
    MsgBox(262192, $Fenster_Titel_1, "Das Fenster 1 konnte nicht aktiviert werden !") ; MsgBox = 1, 4, 1, 1, 2.
    Exit (1)
    EndIf

    Ende des Beispielscripts.
    Das Problem ist dabei, der "WinGetHandle"-Befehl gibt mir kein Handle zurück, in der Variablen "$WHandle" steht nichts.
    Auch @error wird nicht gesetzt und man kann als Fenstertitel oder Fenstertext angeben was man will, es findet keinerlei Unterscheidung statt.
    Auch ein Umstellen des "WinTitleMatchMode" am Anfang des Beispiels, funktioniert nicht.

    Wenn man als Versuch den Befehl "ControlGetHandle" in das Beispielscript einbaut, so funktioniert der aber einwandfrei.

    Vielen Dank für die Hilfe.
    Gruß:
    BigRox

    Einmal editiert, zuletzt von BigRox (4. Juli 2008 um 10:13)

  • Hi,
    du darfst parameter nicht einfach überspringen, auch wenn sie optional sind.
    Entwerder du lässt sie ganz weg, oder machst alle hin.
    Bsp. Winwaitactive:

    WinWaitActive ( "title" [, "text" [, timeout]] )

    Title hast du definiert. Aber du wolltest das Timeout definieren, also musst du einen "text" eingeben oder als Text einen Leerstring verwenden. In deinem Beispiel wäre das dann:

    [autoit]

    WinWaitActive($WinHandle, "",5)

    [/autoit]

    Dazu kommt noch, dass einige Fehler drin sind. So z.B. BlockInput(0)

    Zitat

    BlockInput ( flag )
    1 = Disable user input
    0 = Enable user input

    Mit Blockinput(1) aktivierst du den Input wieder, das hätte dann gar keinen Sinn (es sei denn, dass das hier nur ein ganz kleiner ausschnitt eines Scripts ist, und Blockinput vorher schon auf 0 gesetzt wurde).

    Und wenn das dein ganzes Script ist, dann gibt die Variable keinen Sinn: $WinHandle (Zeile 7)

    Auserdem würde ich es mit else machen, also

    Spoiler anzeigen
    [autoit]

    ; Optionen für dieses Script festlegen.
    Opt("WinTitleMatchMode", 4)

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

    $WHandle = WinGetHandle($Fenster_Titel, $Fenster_Text)

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

    If @error Then
    BlockInput(0)
    MsgBox(262192, $Fenster_Titel_1, "Das Fenster 1 konnte nicht aktiviert werden !") ; MsgBox = 1, 4, 1, 1, 2.
    Exit
    EndIf

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

    else
    WinWait($WHandle, 10)
    WinActivate($WHandle)
    WinWaitActive($WHandle, 5)

    [/autoit]
  • Hallo ano2008,
    ich habe das Beispielscript entsprechend geändert.
    Aber leider funktioniert es immer noch nicht, "WinGetHandle" gibt mir einfach kein Handle zurück.

    Hier das geänderte Beispielscript:


    Opt("WinTitleMatchMode", 4)
    $WHandle = WinGetHandle($Fenster_Titel)
    If @error Then
    MsgBox(262192, $Fenster_Titel_1, "Das Fenster 1 konnte nicht aktiviert werden !") ; MsgBox = 1, 4, 1, 1, 2.
    Exit (1)
    Else
    WinWait($WHandle, "", 10)
    WinActivate($WHandle)
    WinWaitActive($WHandle, "", 5)
    EndIf

    MsgBox(0, "Test", "bis hier geht es " & $WHandle)


    Ende des Beispielscriptes.
    Normalerweise müsste die MsgBox doch auch das Handle des Fensters "$Fenster_Text", anzeigen, da erscheint aber nichts (anstelle der MsgBox stehen in den eigentlichen Scripten weitere Befehle die mit $WHandle etwas anfangen sollen).

    Gru?
    BigRox

  • Ich hab micht vertan oben, sry. Ich hab gedacht, du wolltest, dass wenn ein error auftritt, die msgbox zeigt, aber erst viel zu spät gemerkt, dass Wingethandle gar kein @error zurückgibt, sondern nur einen Leerstring.

    D.h. wir können es einfach so machen, dass geprüft wird, ob das Ergebnis von Wingethandle ein Leerstring also ein "" ist. Wenn dem so ist, dann können wir direkt im vorfeld sagen, ohne versuchen das Handle zu aktivieren, dass es nicht aktiviert werden kann. Dadurch brauchen wir dann das Timeout auch nicht mehr.

    Das wäre dann das Script:

    Spoiler anzeigen
    [autoit]

    Opt("WinTitleMatchMode", 2)
    $WHandle = WinGetHandle($Fenster_Titel)

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

    If $WHandle = "" Then
    MsgBox(262192, $Fenster_Titel, "Das Fenster 1 konnte nicht aktiviert werden !") ; MsgBox = 1, 4, 1, 1, 2.
    else
    WinActivate($WHandle)
    WinWaitActive($WHandle, "")
    MsgBox(0, "Test", "bis hier geht es " & $WHandle)
    endif

    [/autoit]

    Allerdings, musst du jetzt halt noch die Variable für den Fensternamen deklarieren.
    Sry, für das Missverständnis ober, hoffe ich konnte dir helfen :) .

  • Hallo anno2008,
    ich habe heute nocheinmal selber an dem Beispielscript rumgebastelt.
    Dabei ist mir heute sofort aufgefallen, das ich auch einen entscheidenden Fehler gemacht habe.
    "WinGetHandle" konnte doch gar kein Handle zurückgeben, da das Fenster nicht zuvor mit AutoIt aufgerufen wurde (Das Fenster habe ich aber mit einem anderen Befehl aufgerufen und es war auch schon auf dem Bildschirm sichtbar, aber anscheinend erkennt AutoIt das nicht und west dem Fenster daher auch kein Handle zu).
    Tja, warum das so nicht funktioniert, weis ich nicht (es ist halt so, wie es nunmal ist).

    Hier das funktionierende Beispielscript:

    Spoiler anzeigen

    ; Optionen für dieses Script festlegen.
    Opt("WinTitleMatchMode", 4)

    ; Einigen Variablen Werte zuweisen.
    $Fenster_Titel_1 = "Setup-Sprache auswählen"
    $Text = "Wählen Sie die Sprache aus, die während der Installation benutzt werden soll:"

    ; Das Fenster mit AutoIt aufrufen.
    Fensteraufruf (wichtig !!)

    ; Warten bis das Fenster richtig existiert.
    WinWait($Fenster_Titel_1, "", 5) ; Das Timeout braucht man, falls der Fenstertitel nicht stimmt, sonst wartet das Script ewig auf das Fenster.

    ; Das Handle des Fensters ermitteln.
    $WHandle = WinGetHandle($Fenster_Titel_1, $Text)

    ; Die Meldung anzeigen, falls das Fenster nicht gefunden werden kann.
    If @error Then ; "WinGetHandle" setzt laut der Hilfe @error auf 1, falls kein Fenster den angegebenen Kriterien entspricht.
    MsgBox(262192, $Fenster_Titel_1, "Das Fenster 1 konnte nicht aktiviert werden !")
    Exit (1)
    Else ; Die Befehle bis "EndIf" werden ausgeführt falls das richtige Fenster gefunden wurde.
    WinActivate($WHandle)
    WinWaitActive($WHandle)
    EndIf

    ; Ab hier folgen im eigentlichen Script die Befehle, die mit "$WHandle" arbeiten sollen, die MsgBox dient nur zum testen.
    MsgBox(0, "Test", "bis hier geht es" & $WHandle)

    Wie geschrieben, das ist nur ein Beispiel für die Fenstererkennung.
    In den eigentlichen Scripten soll das dann, etwas geändert, an allen Stellen stehen wo es um die Fenstererkennung geht.

    Gruß:
    BigRox

    Einmal editiert, zuletzt von BigRox (4. Juli 2008 um 10:22)