![]() |
AW: Herunterfahren verhindern, Programm nicht beenden
Zitat:
Sherlock |
AW: Herunterfahren verhindern, Programm nicht beenden
Zitat:
Delphi-Quellcode:
procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION;
procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession); begin Message.Result := 0; end; |
AW: Herunterfahren verhindern, Programm nicht beenden
Zitat:
|
AW: Herunterfahren verhindern, Programm nicht beenden
Kommt die Message vielleicht bei dem Application-Fenster an?
Dann könntest du versuchen im WndProc(-Event) der Application die Message bearbeiten. |
AW: Herunterfahren verhindern, Programm nicht beenden
Vielleicht ein ähnlicher Ansatz, der auszugsweise wiedergegeben zum Erfolg führte.:
Der Post ![]()
Delphi-Quellcode:
Deklarationen bei Form:
type TForm1 = class(TForm) ... private { Private-Deklarationen } procedure WMQueryEndSession(var Msg: TMessage); message WM_QUERYENDSESSION; {Messageverarbeitung mit Message anmelden} procedure WMEndsession(var Msg: TMessage); message WM_ENDSESSION; {Messageverarbeitung mit Message anmelden} ... end; .....
Delphi-Quellcode:
Prozeduren: procedure TForm1.WMQueryEndSession(var Msg: TMessage); // Abfolge der Closevorgänge: http://www.delphipraxis.net/965876-post19.html // // [X] am Fenster: Abmelden/Herunterfahren: // OnCloseQuery WM_QUERYENDSESSION // OnClose OnCloseQuery // OnDestroy WM_ENDSESSION // const ENDSESSION_CLOSEAPP = $00000001; {lParam - WM_QUERYENDSESSION} ENDSESSION_CRITICAL = $40000000; ENDSESSION_LOGOFF = $80000000; var CanClose: boolean; begin if (Msg.Msg = WM_QUERYENDSESSION) then begin ShutdownBlockReasonCreate(Application.Handle, ... Form1.FormCloseQuery(NIL,CanClose); {geht, wenn Msg.Result:= 1 nicht gegeben wird, allerdings ist dann das Herunterfahren unter XP behindert - Win7 nicht} {In FormCloseQuery Aufgaben erledigen und CanClose setzen} Application.ProcessMessages; Msg.Result:= ABS(DWORD(CanClose)); {mit 1= true antworten, dann kommt WM_ENDSESSION} end else begin Msg.Result:= 1; {mit 1= true antworten, dann kommt WM_ENDSESSION - sonst wartet Windows auf die} {Beendigung - Schwarzer Abmeldewartebildschirm in Windows 7} end; end; procedure TForm1.WMEndsession(var Msg: TMessage); begin if Msg.Msg = WM_ENDSESSION then {WM_SETTINGCHANGE = 26} begin if Msg.WParam = 1 then {Msg.Result:= 1 wurde in WM_QUERYENDSESSION gegeben -> WM_ENDSESSION mit Msg.WParam = 1} begin {"If the session is being ended, this parameter is TRUE; otherwise, it is FALSE"} Form1.Close; {CloseQuery -> Close} end; ShutdownBlockReasonDestroy(Application.Handle); end; end; procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); {Problem beim automatisierten Herunterfahren/Abmelden: Thread arbeitet nur, wenn CanClose:= false} {Abfolge: 1. X -> Form.CloseQuery -> Form.Close -> Form.Hide} begin {Aufgaben erledigen und dann ...} CanClose := False; {Applikation/Formular kann nicht geschlossen werden} {oder} CanClose := True; {Applikation/Formular geschlossen werden} end; |
AW: Herunterfahren verhindern, Programm nicht beenden
Nachtrag - natürlich zum Schluss noch:
Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
{Abfolge: 1. X -> Form.CloseQuery -> Form.Close -> Form.Hide} begin .... ShutdownBlockReasonDestroy(Application.Handle); .... end; |
AW: Herunterfahren verhindern, Programm nicht beenden
Wenn ich doch von vornherein weiß - als Entwickler der Software sollte ich das wissen - dass die Anwendung beim Beenden noch etwas speichern muss (was auch länger dauert), dann kann man
Delphi-Quellcode:
direkt beim Öffnen der Datei, Datenbank, whatever absetzen und wenn alles fertig ist, dann ein
ShutdownBlockReasonCreate
Delphi-Quellcode:
.
ShutdownBlockReasonDestroy
Das ist auch wesentlich einfacher abzubilden als dieses Rumgefrickel wenn denn dann ein Herunterfahren ansteht. Kann man so auch in der Doku lesen: Zitat:
|
AW: Herunterfahren verhindern, Programm nicht beenden
Zitat:
|
AW: Herunterfahren verhindern, Programm nicht beenden
Zitat:
|
AW: Herunterfahren verhindern, Programm nicht beenden
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe mal was zusammen geschraddelt. Das ist nicht wirklich gut. Aber die angefragte Funktionalität ist da. D.h. der Neustart des Systems wird verhindert. Getestet mit Delphi 2007 unter Windows 10Pro-64Bit und Windows 7Pro-32Bit.
Edit: Geänderte Version. Zusätzlich mit ausführbarer Datei. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz