Autor Beitrag
nachteule
Hält's aus hier
Beiträge: 1



BeitragVerfasst: So 02.04.23 00:14 
Hallo zusammen,

ich habe mit meiner Delphi-Anwendung (Delphi 7) ein Problem beim Herunterfahren von Windows.

Aufgabe der Anwendung ist es, beim Herunterfahren von Windows Daten auf einen
Backup-Server zu kopieren. Dieser Vorgang kann - je nach Daten - bis zu 20
bis 30 Minuten dauern.



Bis hierhin ist alles soweit klar, jetzt zum Problem:

Wenn das System heruntergefahren wird, erscheint der Bildschirm "X Programme müssen noch geschlossen Werden...",
auch genannt "BlockedShutdownResolver".

Das ist soweit auch normal, denn meine Anwendung beantwortet in einer WndProc die Message WM_QUERYENDSESSION mit
message.result:=0, damit die Arbeiten noch erledigt werden können.


Die Dauer, bis Windows die Anwendung automatisch beendet, kann ich über die Registry unter
HKEY_CURRENT_USER\Control Panel\Desktop\WaitToKillAppTimeout frei festlegen, also gibt es hier auch keine Schwierigkeit.

Meine Anwendung muß jedoch einen weiteren, eigenen Prozess (exe-Datei) starten (aktuell mit CreateProcess), was jedoch nicht passiert, solange
der genannte Bildschirm geöffnet ist - Windows blockiert das Starten weiterer Prozesse an dieser Stelle.

Also muß der Bildschirm da weg :-), damit es funktioniert. Das habe ich auch geschafft, indem ich nach WM_QUERYENDSESSION einen
Timer starte, der nach 256 ms mit keyb_event das drücken der ESC-Taste simuliert, was dem Klick auf "abbrechen" gleichkommt.
Der Bildschirm verschwindet und meine Anwendung kann einen Weiteren Prozess starten.


AAABEER:

Das funktioniert nur unter Windows 7. Unter Windows 10 wird keyb_event und mouse_event nicht mehr an den Bildschirm weitergegeben,
er schließt damit nicht und blockiert alles weitere.

Ich habe auch versucht, den Bildschirm mit CloseWindow zu schließen oder "seinen" Prozess csrss.exe zu beenden. Beides führt
"natürlich" zu Windows-Systemfehlern und ist damit nicht denkbar.



Jetzt meine Hoffnung und Frage an euch:

Gibt es einen "sauberen" Weg, diesen Bildschirm mit "offiziellen" Mitteln zu schließen, der dem Klick auf "abbrechen" gleichkommt?



Habt vielen Dank für Eure Hilfe!

Philipp


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am So 02.04.2023 um 16:04
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 02.04.23 16:11 
Moin und :welcome: in der EE!

Du willst genau das tun, was die Windows-Funktion verhindern soll - und wunderst dich, dass es Probleme damit gibt... :nut: :nixweiss: Manchmal frage ich mich, ob es sich wirklich lohnt überhaupt auf solche Anfragen zu reagieren...

Der "saubere Weg" ist deinen Benutzern zu erklären, dass sie zum Herunterfahren des PCs dein Programm starten sollen. Wenn dann die Arbeit getan ist, fährst du den PC runter. :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.