Warten auf ein Fenster das vielleicht nie kommt.

  • Hallo,

    ich möchte folgende Situation lösen.

    Ich starte ein Setup und das kann dann mit zwei verschiedenen Fenstern reagieren. Jetzt habe ich gesehen, dass ich hinter WinWait eine Zeit angeben kann. Aber wie verhindere ich dann, dass WinActivate und ControlClick ausgeführt wird?

    Bin für Hinweise sehr dankbar.


    Edit: BugFix
    Dein Editiergrund:

    Zitat

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Nice_2012« (Gestern, 22:16) aus folgendem Grund: Da es hier offensichtlich mehr um Beleidigung als um Hilfe geht.

    ist hier die einzige Beleidigung!

    [CLOSED] + Verwarnung

    2 Mal editiert, zuletzt von BugFix (23. Juli 2012 um 16:27) aus folgendem Grund: Da es hier offensichtlich mehr um Beleidigung als um Hilfe geht.

    • Offizieller Beitrag

    WinWait gibt bei einem Fehler 0 als Ergebnis zurück. Diesen Wert kannst du abfragen.

    Zitat von Hilfe

    Rückgabewert

    Erfolg: Gibt das Handle des gewünschten Fensters zurück.
    Fehler: Gibt 0 zurück wenn die Wartezeit überschritten wurde.

    [autoit]


    $Hwnd=WinWait("Test","",10) ; 10 Sek. warten
    If $Hwnd <> 0 then
    ;Hier deine Anweisungen die ausgeführt werden sollen
    EndIf

    [/autoit]
  • Wie wäre es einfach beide Varianten in einer Schleife abzugfragen bis eines der Fenster existiert?

    [autoit]


    dim $timeout
    dim $timer=timerinit()
    dim $step1Success = False
    do
    if winexists("Fenster1") then
    functionStep1()
    $step1Success = True
    exitloop
    endif
    if winexists("Fenster2") then
    functionStep1_other()
    $step1Success = True
    exitloop
    endif
    $timeout=timerdiff($timer)
    until $timeout>=60000 ; nach spätestens 60 Sekunden warten abbrechen, Setup startet garnicht oder mit nicht unterstütztem Fenster...
    if $step1Success = False then exit msgbox(0,"Fehler","Timeout für Step 1 überschritten")

    [/autoit]
  • Wenn es 2 verschiedene Fenster sind die erscheinen können dann würde ich es mit folgenden Aufbau machen:

    Spoiler anzeigen
    [autoit]

    While Sleep(100)
    If WinExists("Titel 1") Then
    ;reagiere auf Fenster mit "Titel 1"
    ExitLoop
    EndIf
    If WinExists("Titel 2") Then
    ;reagiere auf Fenster mit "Titel 2"
    ExitLoop
    EndIf
    WEnd

    [/autoit]


    Dann gibt es keine langen TimeOut-Wartezeiten von WinWait.

    Wenn nicht speziell auf ein Fenster reagiert werden soll sondern nur ob eines der beiden erscheint dann reicht auch ein WinWait bei dem man den Fenstertitel über einen regulären Ausdruck abfragt (wo man dann ja beide Titel eintragen kann).

    @Edit: Der über mir denkt genauso wie ich aber schneller... ;)

  • Vielen Dank für die Antworten. Leider dauert es immer etwas bis meine Beiträge freigeschaltet werden. Inzwischen habe ich einfach WinWait mit einer Zeitangabe versehen. Erscheint das Fenster1 also nicht innerhalb von 15 Sekunden , dann geht es weiter im Programm. Das funktioniert soweit ganz prima. Nur würde mich interessieren, was mir den Befehlen "WinActivate" und "ConsoleClick" passiert die direkt danach kommen. Ich konnte zwar nichts negatives feststellen, aber irgend etwas werde sich machen oder?

  • Leider dauert es immer etwas bis meine Beiträge freigeschaltet werden.

    Das verwechselt du mit Tema freischalten, in einem Thema werden deine Folgebeiträge aer sofort angezeigt.

    Leider dauert es Inzwischen habe ich einfach WinWait mit einer Zeitangabe versehen. Erscheint das Fenster1 also nicht innerhalb von 15 Sekunden , dann geht es weiter im Programm. Das funktioniert soweit ganz prima. Nur würde mich interessieren, was mir den Befehlen "WinActivate" und "ConsoleClick" passiert die direkt danach kommen. Ich konnte zwar nichts negatives feststellen, aber irgend etwas werde sich machen oder?

    die Lösung wurde schon gepostet:

    Ganz einfach, du fragst den Rückgabewert ab (das Handle, des zu öffnenden Fensters, bei TimeOut ist das 0):

    [autoit]


    If Not WinWait("Fenster_X", "", $timeout) Then
    ;... das ging daneben
    Else
    ;... jetzt gehts weiter
    EndIf

    [/autoit]

    mfg autoBert