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
Antwort Antwort
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

AW: Herunterfahren verhindern, Programm nicht beenden

  Alt 23. Jun 2016, 13:30
Kommt die Message vielleicht bei dem Application-Fenster an?
Dann könntest du versuchen im WndProc(-Event) der Application die Message bearbeiten.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
THY4243

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

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
THY4243

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

AW: Herunterfahren verhindern, Programm nicht beenden

  Alt 23. Jun 2016, 19:24
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;
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Herunterfahren verhindern, Programm nicht beenden

  Alt 23. Jun 2016, 20:01
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 ShutdownBlockReasonCreate direkt beim Öffnen der Datei, Datenbank, whatever absetzen und wenn alles fertig ist, dann ein 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:
Applications should call this function as they begin an operation that cannot be interrupted, such as burning a CD or DVD. When the operation has completed, call the ShutdownBlockReasonDestroy function to indicate that the system can be shut down.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (23. Jun 2016 um 20:04 Uhr)
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
802 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Herunterfahren verhindern, Programm nicht beenden

  Alt 24. Jun 2016, 06:04
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 ShutdownBlockReasonCreate direkt beim Öffnen der Datei, Datenbank, whatever absetzen und wenn alles fertig ist, dann ein ShutdownBlockReasonDestroy .
Genau so ist es. Siehe mein Post #6. Der Punkt wo genau ShutdownBlockReasonCreate aufgerrufen werden soll, ist hier wohl aber nicht das Problem. Windows zeigt wie gesagt, den Text der BlockReason an, (hat die BlockReason also erkannt) beendet das Programm aber trotzdem...
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
802 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Herunterfahren verhindern, Programm nicht beenden

  Alt 24. Jun 2016, 06:49
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;
Das funktioniert unter Windows 10 auch nicht. Sogar die BlockReason wird bei Deinem Code nicht erkannt/gesetzt. Ist auch nicht verwunderlich, denn durch if (Msg.Msg = WM_QUERYENDSESSION) then wird der Code nie ausgeführt, da Win10 ein ENDSESSION_CRITICAL beim Beenden über den Button im Startmenü sendet. Aber auch wenn man die Zeile auskommentiert klappt es nicht: BlockReason nicht erkannt und Programm wird beendet.
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#7

AW: Herunterfahren verhindern, Programm nicht beenden

  Alt 24. Jun 2016, 12:47
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.
Angehängte Dateien
Dateityp: zip Shutdown.zip (235,3 KB, 46x aufgerufen)

Geändert von samso (24. Jun 2016 um 16:07 Uhr)
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
802 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Herunterfahren verhindern, Programm nicht beenden

  Alt 19. Jul 2016, 12:30
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.
Danke samso, Deine EXE läuft. Wenn ich dein Demoprojekt unverändert mit Delphi 2010 neu kompiliere, läuft es nicht mehr: Man sieht zwar den Text der BlockReason und es geht auch ganz kurz die Frage auf, ob gespeichert werden soll. Dann wird das Programm aber sofort und automatisch geschlossen, ohne das man einen Button im Dialog geklickt hat. Windows fährt dann nicht herunter.

Wenn ich das Projket mit Delphi 10 Seattle neu compliere ist alles OK. Was macht Delphi 2010 also anders? Evtl. eine Compiler-Einstellung oder ein Bug? Kann das jemand mal bitte mit Delphi 2010 ausprobieren? Im Anhang Dein Log, was meine mit Delphi 2010 erzeugte EXE geschrieben hat. Das sieht schon komisch aus.
Angehängte Dateien
Dateityp: txt log.txt (179 Bytes, 21x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Herunterfahren verhindern, Programm nicht beenden

  Alt 21. Jul 2016, 11:48
Das könnte die Antwort sein
http://qc.embarcadero.com/wc/qcmain.aspx?d=84886
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
dGeek
(Gast)

n/a Beiträge
 
#10

AW: Herunterfahren verhindern, Programm nicht beenden

  Alt 21. Jul 2016, 12:11
Unter Windows 10 funktioniert dein beispielprojekt. Unter Windows 7 nicht mehr.
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz