Registriert seit: 15. Dez 2012
Ort: München - Untermenzing
44 Beiträge
Delphi 11 Alexandria
|
AW: Herunterfahren verhindern, Programm nicht beenden
23. Jun 2016, 20:04
Vielleicht ein ähnlicher Ansatz, der auszugsweise wiedergegeben zum Erfolg führte.:
Der Post http://www.delphipraxis.net/965876-post19.html war hilfreich.
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;
|
|
Zitat
|