Einzelnen Beitrag anzeigen

THY4243

Registriert seit: 15. Dez 2012
Ort: München - Untermenzing
44 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: Herunterfahren verhindern, Programm nicht beenden

  Alt 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;
  Mit Zitat antworten Zitat