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
Seite 1 von 3  1 23      
BlueStarHH

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

Herunterfahren verhindern, Programm nicht beenden

  Alt 23. Jun 2016, 10:59
Hallo,

beim Herunterfahren von Windows soll mein Programm das Herunterfahren stoppen (falls die offene Datei noch gespeichert werden muss). Das Programm selbst darf dann auch nicht beendet werden. Mit dem folgendem Code wird zwar das Herunterfahren von Windows gestoppt, das Programm aber trotzdem von Windows beendet. Was ist daran falsch?

Bitte vor dem Herunterfahren auf Button1 klicken, damit ShutdownBlockReasonCreate() aufgerufen wird, was seit Vista nötigt ist, da Windows sonst immer herunterfährt.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  protected
    procedure WMQueryEndSession(var Message: TWMQueryEndSession);
      message WM_QUERYENDSESSION;
    procedure WMEndSession(var Msg: TWMEndSession); message WM_ENDSESSION;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function ShutdownBlockReasonCreate(hWnd: hWnd; pwszReason: LPCWSTR): Bool;
  stdcall; external user32 name 'ShutdownBlockReasonCreate';

function ShutdownBlockReasonDestroy(hWnd: hWnd): Bool; stdcall;
  external user32 name 'ShutdownBlockReasonDestroy';

procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession);
begin
  Message.Result := 0;
end;

procedure TForm1.WMEndSession(var Msg: TWMEndSession);
begin
  Msg.Result := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShutdownBlockReasonCreate(handle, 'Reason gesetzt!');
end;

end.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: Herunterfahren verhindern, Programm nicht beenden

  Alt 23. Jun 2016, 11:09
Meine Idee wäre jetzt dem OnClose-Ereignis des Formulars eine Routine "zu verpassen" und dort Abzufragen, ob das Programmbeendet werden darf oder nicht.
Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caNone; // Das Formular darf nicht geschlossen werden, daher geschieht nichts.
end;
Hier sollte das Programm dann nicht beendet werden.
  Mit Zitat antworten Zitat
BlueStarHH

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

AW: Herunterfahren verhindern, Programm nicht beenden

  Alt 23. Jun 2016, 11:35
Meine Idee wäre jetzt dem OnClose-Ereignis des Formulars eine Routine "zu verpassen" und dort Abzufragen, ob das Programmbeendet werden darf oder nicht.
Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caNone; // Das Formular darf nicht geschlossen werden, daher geschieht nichts.
end;
Hier sollte das Programm dann nicht beendet werden.
Danke, aber das hat keinen Effekt: Windows beendet das Programm trotzdem.
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#4

AW: Herunterfahren verhindern, Programm nicht beenden

  Alt 23. Jun 2016, 11:45
Den ShutdownBlockReason musst Du nach dem Beantworten der WM_QUERYENDSESSION setzen...nicht irgendwann vorher.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann

Geändert von Sherlock (23. Jun 2016 um 11:47 Uhr)
  Mit Zitat antworten Zitat
samso

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

AW: Herunterfahren verhindern, Programm nicht beenden

  Alt 23. Jun 2016, 11:46
Vielleicht hilft das:

http://www.delphipraxis.net/179814-a...ndsession.html
  Mit Zitat antworten Zitat
BlueStarHH

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

AW: Herunterfahren verhindern, Programm nicht beenden

  Alt 23. Jun 2016, 11:53
Den ShutdownBlockReason musst Du nach dem Beantworten der WM_QUERYENDSESSION setzen...nicht irgendwann vorher.

Sherlock
Sicher? Nach meinem Gefühl wäre das viel zu spät. MS schreibt dazu:

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.

Quelle: https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Edit:
Ich habs ausprobiert: Auch damit wird das Programm beendet:

procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession);
begin
Message.Result := 0;
ShutdownBlockReasonCreate(handle, 'Reason gesetzt!');
end;

Der Text der "BlockReason" wird von Windows angezeigt, wenn ich ShutdownBlockReasonCreate per Button-Click oder per WMQueryEndSession aufrufe...

Geändert von BlueStarHH (23. Jun 2016 um 12:02 Uhr)
  Mit Zitat antworten Zitat
BlueStarHH

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

AW: Herunterfahren verhindern, Programm nicht beenden

  Alt 23. Jun 2016, 11:54
Danke, das habe ich gelesen. Hilft leider nicht.

Geändert von BlueStarHH (23. Jun 2016 um 13:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#8

AW: Herunterfahren verhindern, Programm nicht beenden

  Alt 23. Jun 2016, 13:16
Ja, BlueStarHH, hast Recht, ich hatte das falsch interpretiert.

Vertrackt... Hast Du die Möglichkeit zu loggen, was passiert, also welche Messages reinkommen?

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
BlueStarHH

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

AW: Herunterfahren verhindern, Programm nicht beenden

  Alt 23. Jun 2016, 13:25
Ja, BlueStarHH, hast Recht, ich hatte das falsch interpretiert.

Vertrackt... Hast Du die Möglichkeit zu loggen, was passiert, also welche Messages reinkommen?

Sherlock
Kann ich einbauen. Wie? Mit dem Debugger sieht man jedenfalls das erst WMQueryEndSession aufgerunfen wird und dann WMEndSession und danach wird das Programm von Windows beendet.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Herunterfahren verhindern, Programm nicht beenden

  Alt 23. Jun 2016, 13:38
Dumme Idee: Wenn ich den Quelltext in Vcl.Forms richtig verstehe, dann gibt eine VCL-Anwendung auf WM_QUERYENDSESSION immer True (1) zurück. Und gibt das erst gar nicht an deine Formulare weiter.

Umgehen (und richtig bearbeiten) könntest du das indem du Application.HookMainWindow(..) aufrufst und dort deinen eigenen Hook setzt.

Beispiel wäre ungefähr so:

Delphi-Quellcode:
[...]
Application.HookMainWindow(myApp.WndProcHook);
[...]

function TMyApp.WndProcHook(var message: TMessage): Boolean;
begin
   Result := False;

   case message.Msg of
      WM_QueryEndSession:   begin
         Result := True; // Wird in Vcl.Forms nicht weiter abgearbeitet
         (...) // z.B. an Application.MainForm weiterleiten...
      end;
   end;
end;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 19:20 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