Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Windows wurde doch nicht heruntergefahren und ich merke davon nichts (https://www.delphipraxis.net/187504-windows-wurde-doch-nicht-heruntergefahren-und-ich-merke-davon-nichts.html)

Der schöne Günther 4. Dez 2015 12:31

Windows wurde doch nicht heruntergefahren und ich merke davon nichts
 
Wenn Windows heruntergefahren/abgemeldet wird und ich es richtig verstanden habe ist die Reihenfolge so:
  1. WM_QUERYENDSESSION wird an die Anwendung gesendet
  2. Das löst das OnCloseQuery-Event des VCL-Formulars aus
  3. WM_ENDSESSION wird an die Anwendung gesendet um den unausweichlichen Shutdown zu verkünden

In der Doku zu WM_ENDSESSION steht dass dort (im WPARAM) angegeben wird ob denn nun abgemeldet wird oder sich der Benutzer umentschieden hat:
Zitat:

If the session is being ended, this parameter is TRUE; the session can end any time after all applications have returned from processing this message. Otherwise, it is FALSE.

Meine Testanwendung enthält folgenden Message-Handler:
Delphi-Quellcode:
procedure TForm1.WMEndSession(var Message: TWMEndSession);
begin
   ShuttingDown := Message.EndSession;
   //(Logge "ShuttingDown" in eine Textdatei)
   inherited;
end;
Ich starte meine Testanwendung, mache Notepad auf und tippe darin ein paar Buchstaben. Somit wird Windows am Herunterfahren gehindert da mich Notepad noch fragen wird ob ich denn nicht lieber speichern möchte.

Ich gehe auf Herunterfahren, bekomme den "Folgende Anwendungen verhindern das Herunterfahren"-Dialog und sage "Abbrechen".

Meine Anwendung hat den Erhalt der WM_ENDSESSION-Nachricht ordnungsgemäß protokolliert und meint, ShuttingDown sei
Delphi-Quellcode:
True
gewesen. Wie kann das sein? Es hätte doch
Delphi-Quellcode:
False
sein müssen. Wenn wirklich heruntergefahren wird, wird auch
Delphi-Quellcode:
True
protokolliert.


Irgendwas kann da nicht stimmen :|

p80286 4. Dez 2015 12:41

AW: Windows wurde doch nicht heruntergefahren und ich merke davon nichts
 
Mal so herum gesponnen:
um x:00 fährst Du Windows herunter. Ein paar Anwendungen ignorieren das.
um x:30 sagst Du "Na gut dann eben nicht" und kümmerst Dich in Ruhe um die ignoranten Anwendungen.

Dann hat sich Deine brave Anwendung schon längst verabschiedet und bekommt nichts mehr mit.
Anders formuliert könnte es sein, daß Du nicht alle Messages protokollierst?

Gruß
K-H

Der schöne Günther 4. Dez 2015 12:53

AW: Windows wurde doch nicht heruntergefahren und ich merke davon nichts
 
Ich reagiere explizit nur auf
Delphi-Quellcode:
WM_QUERYENDSESSION
("Hey Leute, wir wollen abmelden") und
Delphi-Quellcode:
WM_ENDSESSION
("Wir werden jetzt garantiert abmelden: j/n"). Andere Messages fallen mir nicht ein.

Eigentlich interessiert mich
Delphi-Quellcode:
WM_ENDSESSION
auch nicht einmal mehr, aber mir ist das aufgefallen und ich kann es nicht nachvollziehen warum das so ist.

hathor 4. Dez 2015 12:59

AW: Windows wurde doch nicht heruntergefahren und ich merke davon nichts
 
Um welches WINDOWS geht es?
Seit WINDOWS VISTA ist alles anders:
https://msdn.microsoft.com/en-us/lib...or=-2147217396

Der schöne Günther 4. Dez 2015 13:06

AW: Windows wurde doch nicht heruntergefahren und ich merke davon nichts
 
Es geht mir eigentlich um jedes Windows von XP bis 10. Dass sich hier mit Vista viel geändert hat weiß ich. Aber ich lese da nur heraus dass sich seit Vista das Verhalten mit WM_QUERYENDSESSION geändert hat, nicht aber WM_ENDSESSION.

Sir Rufo 4. Dez 2015 13:44

AW: Windows wurde doch nicht heruntergefahren und ich merke davon nichts
 
Wenn deine Anwendung bei
Delphi-Quellcode:
WM_QUERYENDSESSION
ein
Delphi-Quellcode:
True
zurückliefert, dann ist dieses Verhalten durchaus korrekt, denn
Zitat:

When an application returns TRUE for this message, it receives the WM_ENDSESSION message, regardless of how the other applications respond to the WM_QUERYENDSESSION message.

hathor 4. Dez 2015 16:45

AW: Windows wurde doch nicht heruntergefahren und ich merke davon nichts
 
Folgender Code ist für WIN8.1 völlig uninteressant - oder ist da etwas falsch?
Wie müsste er aussehen, um irgendeine Reaktion auszulösen?

Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
    procedure WMQueryEndSession(var Msg: TWMQueryEndSession);
      message WM_QUERYENDSESSION;
    procedure WMEndSession(var Msg: TWMEndSession);
      message WM_ENDSESSION;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
  if MessageDlg('Close Windows ?', mtConfirmation, [mbYes,mbNo], 0) = mrNo then
    Msg.Result := 0
  else
    Msg.Result := 1 ;
end;

procedure TForm1.WMEndSession(var Msg: TWMEndSession);
begin
  if Msg.EndSession = True then
    ShowMessage('Windows is shutting down ' + #10#13 + 'at ' + FormatDateTime('c', Now));
  inherited;
end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:04 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