AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Herunterfahren verhindern, Programm nicht beenden
Thema durchsuchen
Ansicht
Themen-Optionen

Herunterfahren verhindern, Programm nicht beenden

Ein Thema von BlueStarHH · begonnen am 23. Jun 2016 · letzter Beitrag vom 21. Jul 2016
 
THY4243

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

AW: Herunterfahren verhindern, Programm nicht beenden

  Alt 23. Jun 2016, 19: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:59 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