Fenster schließen falls es kommt

  • Hallo zusammen,

    eigentlich auch eine sehr einfache Frage nur ich drehe mich hier ein wenig im Kreis:

    Ich möchte bei Installation Falls sich ein bestimmtes Fenster öffnet, dass dieses geschlossen wird. WinExists alleine hilft mir da leider nicht, da ich nicht weiß wann genau das Fenster kommt. Dadrum eine while 1 schleife führt dann dazu dass das Skript niemals endet falls das Fenster sich nicht öffnet richtig?

    Habe bis jetzt folgendes:

    Code
    If WinExists("Fenster 1","") Then
       WinClose("Fenster 1","")
       If WinExists("Fenster 2","") Then ; Kommt sicher wenn Fenster 1 kommt
    	  WinClose("Fenster 2","")
       EndIf
    EndIf

    Bin für jede Hilfe dankbar :)

  • Ja, mit der While-Schleife lässt sich das recht gut lösen.

    Hier mal ein Beispiel


    Allerdings solltest du bedenken, dass diese beiden Beispiele auch irgendwann beendet werden sollten. Wie das geschehen soll würde aber vom Zweck deines Vorhabens abhängen.

    MfG Lo..

  • Ja, mit der While-Schleife lässt sich das recht gut lösen.

    Hier mal ein Beispiel


    Allerdings solltest du bedenken, dass diese beiden Beispiele auch irgendwann beendet werden sollten. Wie das geschehen soll würde aber vom Zweck deines Vorhabens abhängen.

    MfG Lo..

    Besten Dank für die schnelle Antwort! Ja ich würde einen Timeout von 3 Minuten vorschlagen. Wenn alle Fenster vorher schon erscheinen, dann beendet sich die Schleife auch oder? Wie bringe ich den denn am besten hier ein?

    Eleganter wäre es gewesen mit WinWaitActivate (vom Recorder) und dem Timeout nur damit lassen sich ja leider keine If Bedingungen machen ...

    Einmal editiert, zuletzt von cdn123 (10. Mai 2016 um 20:21)

  • Habe mir nochmal gedanken drüber gemacht und die While-Schleife verworfen...

    Die ersten beiden Zeilen packst du am Anfang deines Scripts und die Funktion ans Scriptende.

    Kurze Erläuterung:
    Zeile 1 :: Liste der Fensternamen. Die 4 ist die Anzahl der eingetragenen Namen. Das Muster sollte selbsterklärend sein ^^
    Zeile 2 :: Dieser Befehl sorgt dafür, dass die Funktion 1 mal pro Sekunde aufgerufen wird.
    Im Idealfall packst du diese Zeile dorthin, wo du anfängst die Fensterprüfung zu brauchen. Wenn der Schritt erreicht ist, wo du das nicht mehr brauchst, schreib in der nächsten Zeile
    AdlibUnRegister("Fensterschliesser"). Das beendet die sekündliche Funktionsausführung.

    Zur Funktion:
    Zeile 6 :: $Array_Titel ist, wie der Name es schon sagt ein Array. Eine Variable, mit mehr als nur 1 Element als Inhalt.
    Ubound($Array_Titel) -1 gibt die Anzahl der Elemente aus diesem Array zurück. Da das Array auf 0 basiert, müssen wir bei 0 anfangen zu zählen.

    Zeile 7 :: Die For-Next Schleife geht nun Schritt für Schritt die Namen durch, die in dem Array vorhanden sind. Also erst "Titel 1", dann "Titel 2" usw bis der letzte Titel durch ist.
    $Array_Titel[$i] steht also erst für $Array_Titel[0], dann für $Array_Titel[1], danach $Array_Titel[2] und dann für $Array_Titel[3]
    das entspricht "Titel 1", "Titel 2", "Titel 3" und "Titel 4"

    Zeile 8 :: sagt nur, dass die Schleife erneut durchlaufen werden soll, wobei $i um 1 erhöht wird, bis das Limit erreicht ist ( dieses Ubound -1)

    Ich hoffe, du verstehst nun, was mein Beispiel macht :)

  • Wow besten Dank für den Code. Nur muss sagen so richtig verstehe ich diesen nicht. Habe mir in Zwischenzeit was neues gebastelt nur irgendwo hapert es noch dran vielleicht könnt ihr mir sagen warum der Rückgabewert immer 0 ist ?! Fände die Lösung sonst sehr elegant weil Sie sehr gut zu meinem programm passt:

    Wenn man das irgendwie zum laufen bringen könnte...

  • Ach besten Dank! Klappt soweit alles. Super!!

    Noch eine kleine Frage: Am Ende der Installation wird der Button Beenden klickbar. Gerne würde ich diesen dann auch direkt klicken. Habe mit dem WindowsInfo alles soweit rausbekommen aber irgendwo scheitert es noch am Skript:

    AutoIt
    While 1
       If ControlCommand("Fenster1", "" ,"[CLASS:Button; INSTANCE:3]", "IsEnabled", "") Then
    	  WinActivate("Fenster1")
    	  Send("{B}")
    	  ExitLoop
       EndIf
        Sleep(100)
    WEnd

    Seht ihr da direkt den Fehler? :)

    Erledigt. War der falsche Button. Oweia, ist schon zu spät.

    Einmal editiert, zuletzt von cdn123 (10. Mai 2016 um 22:19)