Überprüfen, ob ein Fenster existiert

  • Hallo,


    ich habe mal ne Frage.


    Also, manche Programme brauchen während des eigentlichen Installationsprozesses sehr lange, bis das nächste Fenster erscheint.


    Insbesondere bei älteren Rechnern hatte ich dann das Problem, dass das Skript stehen geblieben ist.


    Die bisher absolute Krönung was Installationszeiten angeht, habe ich jetzt bei Data Becker CD-DVD-Druckerei erlebt. Da hat die Installation mit meinem Athlon 6000 satte 15 Minuten gedauert.


    Also habe ich nach einem Weg gesucht, zu verhindern, dass mein SKript ins Leere läuft, weil die Installation zu lange dauert.


    Meine Überlegung war, permanent zu testen, ob das nach dem Installationsvorgang folgende Fenster existiert.


    Leider habe ich keine Ahnung vom Umgang mit Schleifen. Nach einigem Testen habe ich dann folgende Schleife in mein Skript integriert:


    ; Warteschleife während der Installation
    If Not WinExists("Setup - CD-DVD Druckerei 7","Beenden des CD-DVD") Then

    Do
    WinWait("Setup - CD-DVD Druckerei 7","Beenden des CD-DVD")

    Until WinExists("Setup - CD-DVD Druckerei 7","Beenden des CD-DVD")

    EndIf


    Damit wurde das Skript fortgesetzt.


    Meine Frage ist, ob meine Überlegung richtig war, oder ob es eine bessere, sichere Möglichkeit gibt, zu testen, ob bzw. wann das nächste Fenster existiert / erscheint.


    Oder gibt es noch einen ganz anderen Lösungsansatz für mein Problem?


    Ich habe hier im Forum schon länger nach ähnlichen Beiträgen gesucht, bin aber leider nicht fündig geworden.


    Gruß Tom

    Einmal editiert, zuletzt von Onkel-tom (20. Januar 2010 um 01:04)

  • Hallo und guten Morgen,

    wenn Du es automatisiert machen willst ist SeuBos Code gut :) , falls sich aber ein Parameter des Fensternamens ändert, lässt sich das so wohl nicht prüfen.
    Speziell was den Umgang mit "Kindern" von Programmen angeht, benutze ich immer Tools von der Sysinternals Seite (https://autoit.de/www.winternals.com). Der Typ (Mark Russinovich) hat sich die Mühe gemacht zu analysieren, was Alles bei Windows so im Hintergrund abläuft und wurde vor einigen Jahren von M$ aufgekauft :( .

    Wusste er möglicherweise zu viel über Windows Innenleben und wäre M$ möglicherweise durch seine Veröffentlichungen gefährlich geworden? ?(

    Das Tool Process Explorer verrät Dir welche Prozesse überhaupt laufen und wie deren Fortpflanzung ist. Ergänzend gibt es dazu eine Kommandozeilenversion, mit der sich Automatisierungen durchführen lassen.

    Gruß

    gnArFl

  • Hallo,

    Danke für die Antworten.

    Ich möchte Installationen automatisieren. Daher ist mir mit dem Code von SeuBos geholfen.

    @ SeuBos:

    Ich habe halt die Erfahrung gemacht, dass insbesondere bei langsameren Rechnern Skripte ins Leere laufen, wenn die eigentliche Installation zu lange dauert und ich "winwait" benutzt habe. Daher wollte ich das Ganze mit einer Schleife absichern, weil Sleep-Befehle mir dafür zu ungenau sind.

    Also, wenn ich recht verstanden habe, kann ich mir die "If not...."-Schleife schenken und nach Beginn der eigentlichen Installation direkt fortfahren mit

    Do
    Sleep(100)
    Until WinExists("Setup - CD-DVD Druckerei 7","Beenden des CD-DVD"),

    um damit alle 1/10 Sekunde abfragen, ob das Fenster bereits existiert?

    Dann habe ich wohl zu sehr "um die Ecke" gedacht. ;( :D

    Danke für die Hinweise.

    Gruß Tom

  • Hallo Tom,

    Genau um dieses "ins Leere laufen" zu verhindern, hat WinWait einen TimeOut befehl. Dies ist der dritte Parameter (der übrigens Optional ist). Also wenn das Fenster nach X sekunden (zB.: nach 1200 sek. (=20 min)) nicht gefunden wurde, wird von der WinWait Funktion 0 zurückgegeben, und das Skript wird vorgestetzt. Ein Beispiel:

    [autoit]


    Run("notepad.exe")
    If WinWait("Unbenannt - Editor","",10) = 0 then
    MsgBox(0,"","Editor konnte innhalb von 10 sekunden nicht gefunden werden.")
    Exit
    Endif

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

    ;Hier würde es dann weitergehen, wäre die Zeit nicht abgelaufen
    WinActivate("Unbenannt - Editor")
    Send("Ich schreibe etwas in den Editor!")

    [/autoit]

    Das ist jetzt frei aus dem Kopf geschrieben, aber ich denke der relevante Part (If WinWait("Unbenannt - Editor","",10) = 0 then... ) sollte ersichtlich sein.

    Diesen TimeOut befehl kannst du aber auch mit der Do..Until Schleife wie folgt nachbauen:

    [autoit]

    $timer = TimerInit()
    Do
    Sleep(100)
    If TimerDiff($timer) > 1200000 Then ;(20min)
    MsgBox(0,"","Setup konnte innhalb von 20 Minuten nicht gestartet werden.")
    Exit
    EndIf
    Until WinExists("Setup - CD-DVD Druckerei 7","Beenden des CD-DVD")

    [/autoit]


    Liebe Grüße
    SEuBo

  • Hallo SEuBo,

    den Timeout-Befehl habe ich bisher nur verwendet, um zu verhindern, dass ein Skript stehen bleibt, wenn ein Fenster mal erscheint und mal nicht.

    Dass man damit den Winwait-Befehl hinsichtlich seiner Dauer steuern kann, war mir nicht wirklich bewusst.

    Das einzige Problem dabei entsteht, wenn ich die Zeit für Timeout zu knapp kalkuliere.

    Das was ich gesucht habe, war eine Möglichkeit, permanent zu testen, ob ein bestimmtes Fenster existiert.

    Ich habe Deinen ersten Schleifen-Vorschlag

    Do
    Sleep(100)
    Until WinExists("Setup - CD-DVD Druckerei 7","Beenden des CD-DVD")

    in mein Skript integriert und das Skript auf einen relativ langsamen Rechner laufen lassen. Die Installation hat, vom Klick auf "installieren" bis zum genannten Fenster, fast 40 Minuten (!!) gedauert und das Skript ist fehlerfrei gelaufen.

    Daher reicht mir dieser simple Lösungsansatz aus.

    Inzwischen habe ich das mit mehreren Skripten erfoglreich getestet.

    Vielen Dank für die Unterstützung.

    Gruß Tom