AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

WM_QUERYENDSESSION verwenden

Ein Thema von JFB · begonnen am 10. Jun 2009 · letzter Beitrag vom 12. Jun 2009
Antwort Antwort
JFB

Registriert seit: 8. Apr 2005
61 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

WM_QUERYENDSESSION verwenden

  Alt 10. Jun 2009, 16:51
Hallo,

vorweg: Ich weiß, dass es zu diesem Thema bereits unzählige Beiträge in diesem Forum gibt. Ich habe mich bereits stundenlang da durch gequält. Leider ohne greifbares Ergebnis.

Mein Problem ist folgendes:
Ich möchte meine Anwendung "geregelt" (alles Speichern usw.) beenden, wenn der Anwender Windows herunterfährt. Dafür habe ich z.B. folgendes in das Hauptformular meiner Anwendung eingebaut:

Delphi-Quellcode:
procedure WMQueryEndSession(var Msg:TWMQueryEndSession); message WM_QUERYENDSESSION;

procedure TFMain.WMQueryEndSession(var Msg:TWMQueryEndSession);
begin
  showmessage('***Ende***');
  Msg.Result := 1;
end;
Es scheint so zu sein, dass meine Anwendung die Nachricht nicht erhält, weder beim einfachen "Abmelden" noch beim "Herunterfahren". Jedenfalls wird ShowMessage nicht ausgeführt und Windows fährt nicht herunter.

Wer weiß, wie es richtig gemacht werden muss?

Gruß
Johann
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.336 Beiträge
 
Delphi XE2 Professional
 
#2

Re: WM_QUERYENDSESSION verwenden

  Alt 10. Jun 2009, 16:58
Hallo,

ich mach das in meinen Programmen immer so:

Delphi-Quellcode:
private
    procedure WMQueryEndSession(var Msg: TWMQueryEndSession); message WM_QueryEndSession;

{...}

procedure TMainForm.WMQueryEndSession (var Msg : TWMQueryEndSession);
begin
  //Windows erlauben zu beenden
  Msg.Result := 1;

  //Wenn Windows beendet wird, dann Variable auf true setzen
  Windows_Session_End := true;

  //Programm schliessen
  close;

  inherited;
end;
Mit der Variablen "Windows_Session_End" umgeh ich die Frage ob wirklich beendet werden soll, beim Schliessen des Programmes
und Speichere gleich drauf los
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
JFB

Registriert seit: 8. Apr 2005
61 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: WM_QUERYENDSESSION verwenden

  Alt 10. Jun 2009, 17:04
Hallo Helmi,

vielen Dank für deine Antwort. Mein Problem ist allerdings nicht, wie ich überflüssige Abfragen verhindere oder das Programm beende, sondern dass die Botschaft WM_QUERYENDSESSION scheinbar garnicht in meinem Programm ankommt.

Gruß
Johann
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#4

Re: WM_QUERYENDSESSION verwenden

  Alt 10. Jun 2009, 17:44
Wenn Windows nicht beendet wird, reagiert deine Anwendung offensichtlich auf diese Nachricht.

ShowMessage aufzurufen ist an dieser Stelle eine ganz schlechte Idee.
Diese Nachricht muss unverzüglich beantwortet werden.
Windows befindet sich sozusagen im Ausnahmezustand, bis alle Anwendungen reagiert haben.
Da darf man nicht einfach neue Fenster erstellen.
Wenn man das Beenden von Windows verhindert, kann man sich aber selbst noch schnell eine Nachricht Posten und nachträglich auf dieses Ereignis reagieren.

http://www.developia.de/forum/viewtopic.php?t=83552
  Mit Zitat antworten Zitat
JFB

Registriert seit: 8. Apr 2005
61 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: WM_QUERYENDSESSION verwenden

  Alt 10. Jun 2009, 18:03
@Blub

Wenn ich ShowMessage mal testweise durch close ersetze, passiert ebenfalls rein garnichts. Die Anwendung bleibt geöffnet, ist weiter bedienbar und Windows aktiv, so als ob ich garnichts gemacht hätte.
Übrigens: In einer kleinen Testanwendung, die nur aus dem Hauptfenster bestand, hat die Behandlung von WM_QUERYENDSESSION wunschgemäß funktioniert.

Gruß
Johann
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#6

Re: WM_QUERYENDSESSION verwenden

  Alt 11. Jun 2009, 17:08
Auch Close solltest du an dieser Stelle nicht aufrufen.
Windows hat noch nicht entschieden ob es beendet wird.
Es fragt alle Fenster ab und wenn auch nur eins mit 0 antwortet, passiert nichts.

Das ist die Standardantwort die jedes Fenster zurückgibt:
Delphi-Quellcode:
begin
  Msg.Result := 1;
end;
Das einzige sinnvolle andere Reaktion ist Result auf 0 zu setzen und/oder sich dieses Ereignis zu merken.
Der von Helmi gepostete Code gehört eigentlich in die Verarbeitung der Nachricht WM_EndSession.

Wenn deine Methode WMQueryEndSession entfernt wird und sich Windows trotzdem nicht beenden lässt, dann reagiert irgend ein anderes Fenster deiner Anwendung falsch auf diese Nachricht. Das kann auch ein unsichtbares Fenster sein, das z.B. von irgend einer Komponente/Klasse für interne Zwecke erzeugt wurde.
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.336 Beiträge
 
Delphi XE2 Professional
 
#7

Re: WM_QUERYENDSESSION verwenden

  Alt 11. Jun 2009, 19:17
Stimmt - Das close ist falsch.
Eigentlich kann man das close auch gleich vernachlässigen
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  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
 
#8

Re: WM_QUERYENDSESSION verwenden

  Alt 11. Jun 2009, 19:50
Auch das Setzen des Flags "Windows_Session_End" ist formal gesehen falsch.

Denn hier steht, das nach WM_QUERYENDSESSION die Nachricht WM_ENDSESSION mit dem Ergebnis von WM_QUERYENDSESSION gesendet wird.

cu

Oliver
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)
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.336 Beiträge
 
Delphi XE2 Professional
 
#9

Re: WM_QUERYENDSESSION verwenden

  Alt 11. Jun 2009, 20:03
Ich habs ausprobiert:
Bei WM_EndSession das Flag setzen ist zu spät

Ich habs daran gemerkt, dass meine Meldung, ob wirklich geschlossen werden soll, trotzdem kam, als ich Windows beendete
Mit dem Flag will ich das aber überbrücken.
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#10

Re: WM_QUERYENDSESSION verwenden

  Alt 12. Jun 2009, 14:58
Für eine Frage ob die Anwendung wirklich geschlossen werden soll, kenne ich in dieser Situation nur diese Variante.
Ist zwar umständlich, funktioniert aber sicher.

Wenn noch Daten in Bearbeitung sind die Nachricht mit 0 beantworten und dem eigenen Fenster eine Nachricht posten.
Diese Nachricht kann auch die Info enthalten, in welchen Modus Windows versetzt werden sollte (siehe unten).

Als Reaktion auf diese Nachricht dann die Frage nach dem Speichern/Beenden und wenn erfolgreich/ja anschließend Close.
Zum Schluss Windows selbst in den entsprechenden Modus versetzen oder diesen Schritt dem Anwender überlassen.
  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 11:18 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