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
Global $_Cntr, $_Wnd[200], $_Wnd_Handle, $_Wnd_Titel
; Ein Array mit allen geöffneten Fenster erstellen.
$_Wnd = WinList()
; Eine Schleife zum durcharbeiten des Arrays mit den aktuell geöffneten Fenstern starten.
For $_Cntr = 1 To $_Wnd[0][0]
$_Wnd_Titel = $_Wnd[$_Cntr][0] ; Titel des aktuellen Fensters aus der Fenster-Liste.
$_Wnd_Handle = $_Wnd[$_Cntr][1] ; Handle des aktuellen Fensters aus der Fenster-Liste.
; Feststellen, ob das Fenster auch sichtbar ist und einen Titel hat (unsichtbare Fenster dürfen z.T. nicht geschlossen werden !).
If Not BitAND(WinGetState($_Wnd_Titel), 2) Or $_Wnd_Titel = "" Then
ContinueLoop
EndIf
;MsgBox(262144, "", $_Wnd_Titel & " _ " & $_Wnd_Handle)
; Bestimmte Fenster, die nicht geschlossen werden dürfen/sollen, überspringen.
If Not $_Wnd_Titel = StringInStr($_Wnd_Titel, "Program Manager") And _ ; Wird dieses Fenster geschlossen, so wird auch Windows beendet !
Not $_Wnd_Titel = StringInStr($_Wnd_Titel, "Start") And _ ; Wird dieses Fenster geschlossen, so wird auch Windows beendet !
Not $_Wnd_Titel = StringInStr($_Wnd_Titel, "Host für die Windows Shell-Oberfläche") And _ ; Bei Windows 10, darf auch dieses Fenster nicht geschlossen werden !
Not $_Wnd_Titel = StringInStr($_Wnd_Titel, "Wartehinweis") _ ; Das Fenster des Wartehinweis soll ja angezeigt bleiben.
Then
;Not $_Wnd_Titel = StringInStr($_Wnd_Titel, "Werkzeuge") And _
;Not $_Wnd_Titel = StringInStr($_Wnd_Titel, "Farben") And _
; Das zu schließende Fenster aktivieren (einige Fenster reagieren nur so).
WinActivate($_Wnd_Handle)
; Sleep(), zur Sicherheit.
Sleep(350)
; Das aktuelle Fenster schließen.
WinClose($_Wnd_Handle)
Sleep(1000)
; Warten bis das Fenster nicht mehr existiert (damit die Funktion unterbrochen wird, bis eine eventuell erscheinendes "Datei speichern"-Frage beantwortet wurde).
Do
Sleep(500)
Until Not WinExists($_Wnd_Handle)
Sleep(2000)
EndIf
Next
Alles 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