Alle Fenster schließen

  • Hallo,
    ich habe ein Script geschrieben, das alle geöffneten Fenster schließen soll.
    Wenn aber noch was gespeichert werden soll, so soll das Script pausieren, bis das gemacht wurde (die erscheinende Abfrage bestätigt wurde).
    Nur bei einigen Programmen funktioniert das nicht.
    Hier das Script:

    Spoiler anzeigen

    Ein Programm bei dem das nicht funktioniert ist "Paint.NET 4.09".
    Wenn ich da z.B. die Toolbox geöffnet habe, so wird diese zwar auch geschlossen, aber dann bleibt das Script in der letzten Do - Until-Schleife hängen, obwohl das Fenster nicht mehr existiert.
    Ein Handle ist doch einmalig im System und wenn das dazugehörende Fenster geschlossen wird, so existiert das Handle nicht mehr, aber warum erkennt das Script das bei einigen Fenstern nicht ?nicht ?
    Bei den meisten Programmen funktioniert das, aber bei einigen bleibt das Script hängen.

    Oder muss da noch eine Abfrage mit rein, um festzustellen, ob ein Fenster zu einem Hauptfenster gehört und somit übersprungen werden muss, wie z.B. die Toolbox von Paint.NET die ja alleine nicht existieren kann.
    Wenn man nämlich das Werkzeuge-Fenster überspringt und nur das Hauptfenster von Paint.NET schließen lässt, so funktioniert das Script.
    Aber dafür müsste man ja alle Fenster die übersprungen werden sollen, einzeln eintragen und das will ich nicht, dass Script soll universell einsetzbar sein.


    MfG:
    BigRox

  • Hallo autoBert,
    ich habe es eben mal ausprobiert.
    Ich habe es auch mit sehr vielen verschiedenen Variationen ausprobiert.
    Das Ergebnis war leider immer:
    Es funktioniert nicht.

    Der Befehl wurde nie richtig ausgeführt. Dem Befehl war es einfach immer egal, ob es ein Parent- oder Child-Fenster war, wenn er reagierte war das Handle egal.
    Parent- und Child-Fenster haben zwar unterschiedliche Titel und Handles, aber das interessiert bei einigen Programmen nicht mehr.

    Hat das eventuell damit zu tun, dass sich .NET Framework und AutoIt nicht vertragen ?

    Zuerst habe ich gedacht, dass dies etwas mit Windows 10 zu tun haben könnte, aber nun habe ich das Script mal mit Windows 7 (beidesmal die 64-Bit- und Pro Variante) ausprobiert und da war es das selbe, es funktioniert nicht.

    MfG:
    BigRox

  • Ich geh mal davon aus, dass WinClose() einfach nur ein Wrapper für CloseWindow() ist.
    Und das minimiert eigtl. nur ein Fenster (außer in der WindowProc des Fensters wird beschlossen es zu schließen).
    Schließen/Zerstören kann nur der Thread der das Fenster erstellt hat und wenn Paint.NET meint, dass anstatt die Toolbox zu zerstören sie zu minimieren besser passt lässt sich daran nicht rütteln.

  • Hallo,
    ich habe eben noch etwas mit dem Problem rum experimentiert.
    Dabei kam folgendes raus:

    Selbst wenn man die Windows Tastenkombination "<ALT> + F4" mit AutoIt an das Fenster sendet, funktioniert es nicht.
    Wenn man jedoch die Tastenkombination manuell eingibt, so schließt sich das Fenster und alle Unterfenster immer sofort.

    Wenn man das ganze mit dem Programm "CloseAll" macht, so funktioniert das ganze auch einwandfrei.
    Wie das Programm das intern macht, dass weiß ich leider auch nicht.

    Das scheint also wirklich ein AutoIt-Problem zu sein.

    MfG:
    BigRox

    Einmal editiert, zuletzt von BigRox (6. April 2016 um 18:43) aus folgendem Grund: Programmnamen korrigiert.

  • Selbst wenn man die Windows Tastenkombination "<ALT> + F4" mit AutoIt an das Fenster sendet, funktioniert es nicht.
    Wenn man jedoch die Tastenkombination manuell eingibt, so schließt sich das Fenster und alle Unterfenster immer sofort.

    Du solltest das ganze mal mit #RequireAdmin am Skriptanfang versuchen.

  • Hallo AutoBert,
    das mit dem #RequireAdmin am Skriptanfang war auch eine von den vielen Variationen bei meinen Tests.

    Das hat aber auch nie irgendetwas am Ergebnis geändert.

    Den Prozess von z,B Paint.NET beenden, geht auch nicht, den dann wird Paint.NET zwar sofort geschlossen, aber eventuell vorhandene Dateiänderungen sind auch sofort weg und das geht gar nicht.

    Der einzige Weg scheint mir ein externes Programm (CloseAll) aufrufen und es damit zu machen.
    Das funktioniert und damit gehen eventuell vorhandene Dateiänderungen auch nicht verloren.

    MfG:
    BigRox

  • Hallo,
    irgendwie hat mir die Sache einfach keine Ruhe gelassen.
    Ich wollte einfach nur wissen, ob es nicht doch irgendwie geht.
    Also habe ich immer weiter rum experimentiert und bin dann irgendwann auf den
    " _WinAPI_GetWindowLong($_Wnd_Handle, $GWL_HWNDPARENT)" Befehl gestoßen und siehe da, damit geht es doch.

    Mein Script sieht jetzt so aus:

    Spoiler anzeigen


    Und das funktioniert weil der Befehl nur bei Child-Fenstern ein Handle zurückgibt, bei Fenstern ohne Child kommt 0 zurück und das kann man mit AutoIt auswerten.

    MfG:
    BigRox