Neno Lojes Vista-Tagebuch

Tag 35: Jetzt bloß nicht herunterfahren!

Es gibt Momente, in denen sollte das System besser nicht herunterfahren und Ihre Anwendung nicht plötzlich beenden. Das ist beispielsweise bei CD-Brennsoftware der Fall, während diese gerade am brennen ist, oder während Festplattenformatierungen, TV-Aufnahmen oder bei bestimmten Transaktionen.

Damals unter Windows XP

Steht das Herunterfahren an, schickt Windows als erstes die Nachricht WM_QUERYENDSESSION an Ihr Programm. Antwortet man darauf mit TRUE, welches einem "Ja, ich bin bereit geschlossen zu werden" gleich kommt, folgte die Nachricht WM_ENDSESSION und man hat fünf Sekunden, die Anwendung zu beenden und an die nächste Anwendung wurde WM_QUERYENDSESSION verschickt. Unter Windows XP konnte man auf WM_QUERYENDSESSION mit FALSE antworten, wenn es einen Grund gab, das Herunterfahren abzubrechen.

Das Verhalten hatte für den Benutzer so seine Tücken. Im ungünstigsten Falle würde er nach dem "Wollen Sie wirklich beenden?"-Fenster trotz Bestätigung noch weitere solche Fenster sehen – je nachdem, wie viele Anwendungen das Herunterfahren blockieren (oder zu langsam schließen). Mal abgesehen davon ist der Grund häufig nicht ersichtlich.

Oder auch sehr beliebt: Sie drücken auf Herunterfahren und minutenlang passiert nichts, da ein Programm im Hintergrund das Herunterfahren still und klangheimlich verbietet. Damit soll Schluss sein!

Alles neu, macht das API: unter Windows Vista

In Vista sieht das für den Benutzer anders aus. Er bekommt beim Versuch Herunterzufahren eine Liste von Programmen, die dies verhindert, samt einem kurzen Hinweistext wie z.B. "CD wird gebrannt" oder "Nimmt gerade auf". Entscheidet sich der Benutzer dennoch zu beenden, kann das Programm sich über diese Entscheidung nicht mehr hinwegsetzen, wird jedoch entsprechend in informiert (WM_QUERYENDSESSION mit ENDSESSION_FORCEFULSHUTDOWN-Flag).

Wie kommen nun die Hinweistexte in den Dialog des Benutzers? Anwendungen nutzen ein neues Shutdown API, um proaktiv - also nicht erst beim Herunterfahren – anzugeben, dass es einen Grund gibt, der gegen das Herunterfahren spricht. Angemeldet wird solch ein Grund über das API ShutdownBlockReasonCreate, gelöscht über ShutdownBlockReasonDestroy und abgefragt mit ShutdownBlockReasonQuery. Für C#-Programmierer steht auch ein Codeclip zur Verfügung. Natürlich darf auch die Referenz der API-Nachrichten und Funktionen an dieser Stelle nicht fehlen.

Fazit: Die meisten Anwendungen können gut damit leben, ohne das Herunterfahren von Windows verhindern zu wollen. Sollten Sie dennoch ein Programm schreiben, welches dies benötigt, melden Sie zu Beginn des Verhinderungsgrundes diesen über das API an, und natürlich später auch wieder ab. Rechnen Sie nicht damit, dass das Verhindern immer erfolgreich sein wird – der Benutzer hat hier die Macht. Also auch wenn Sie auf WM_QUERYENDSESSION mit FALSE geantwortet haben, sollte es Sie nicht verwundern, kurz darauf dennoch ein WM_ENDSESSION zu empfangen.

Ein schönes Wochenende – ich fahre jetzt herunter,

Ihr Neno Loje

P.S. Übrigens als kleiner Tipp: Falls Sie langwierige Operationen beim Beenden Ihrer Anwendung durchführen wollen, antworten Sie auf WM_QUERYENDSESSION schnellstmöglich mit TRUE, dann haben Sie nach Empfang von WM_ENDSESSION noch 30 Sekunden Zeit bevor Windows ungeduldig wird.

P.P.S. Achtung: Nur Programme, die auch über ein Hauptfenster verfügen, können das Herunterfahren von Window verhindern, Hintergrundprogramm nicht!

Neno Loje
Freier Berater & Fachautor
Sie haben Fragen zu Visual Studio Team System (VSTS) oder Anregungen und Kommentare zu meinem Vista-Tagebuch? Dann freue ich mich auf Ihre Nachricht.

* *
* *