Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Unterscheidung OnClose durch Nutzer oder Windows ausgelöst (https://www.delphipraxis.net/150336-unterscheidung-onclose-durch-nutzer-oder-windows-ausgeloest.html)

RSE 14. Apr 2010 08:52


Unterscheidung OnClose durch Nutzer oder Windows ausgelöst
 
Hallo!

Wie kann ich unterscheiden, ob der Nutzer mein MainForm geschlossen hat (x oben rechts) oder ob Windows das Programm beendet haben möchte (z.B. wegen Herunterfahren)? Application.Terminated ist in keinem Fall gesetzt und der Sender ist auch immer TMainForm.

DeddyH 14. Apr 2010 09:13

Re: Unterscheidung OnClose durch Nutzer oder Windows ausgelö
 
Wenn Windows herunterfährt schickt es eine WM_QUERYENDSESSION-Nachricht. Das kannst Du ja als Suchbegriff verwenden ;)

himitsu 14. Apr 2010 10:19

Re: Unterscheidung OnClose durch Nutzer oder Windows ausgelö
 
Schickt Windows nicht auch ein WM_QUIT an die Anwendung?
(sowas könnten auch andere Programme versenden)

Also wenn die Anwendung (Application) beendet wird (WM_QUIT) oder wenn WM_ENDSESSION reinkommt, dann setzt man eine Variable und beendet das Programm.
Wenn ein WM_CLOSE (OnClose, bzw. WM_CLOSEQUERY) beim Fenster ankommt, dann prüft man diese Variable.
Ist sie gesetzt, dann war es nicht der "User", welcher direkt das Programmfenster schließen wollte.


Die Frage WM_QUERYENDSESSION alleine fragt nur, ob Windows runtergefahrten werden darf und WM_ENDSESSION besagt, jetzt wird es runtergefahren.

Luckie 14. Apr 2010 10:33

Re: Unterscheidung OnClose durch Nutzer oder Windows ausgelö
 
Aber das WM-QUIT bekommst du auch, wenn du als Benutzer das Programmfenster schließt.

himitsu 14. Apr 2010 11:12

Re: Unterscheidung OnClose durch Nutzer oder Windows ausgelö
 
Zitat:

Zitat von Luckie
Aber das WM-QUIT bekommst du auch, wenn du als Benutzer das Programmfenster schließt.

Es kommt aber erst nach OnClose/OnClodeQuery.
Wenn man nun in OnCloseQuery den Vorgang abbricht, dann wird das Fenster und somit die Anwendung nicht geschlossen und es kommt demnach auch kein WM_QUIT. :angel2:

DeddyH 14. Apr 2010 11:17

Re: Unterscheidung OnClose durch Nutzer oder Windows ausgelö
 
Ich denke, er bezog sich auf den Satz
Zitat:

Zitat von himitsu
Also wenn die Anwendung (Application) beendet wird (WM_QUIT) oder wenn WM_ENDSESSION reinkommt, dann setzt man eine Variable und beendet das Programm.

WM_QUIT hat ja mit WM_ENDSESSION nichts zu tun, da diese Message ja nicht nur verschickt wird, wenn Windows heruntergefahren wird.

Luckie 14. Apr 2010 11:18

Re: Unterscheidung OnClose durch Nutzer oder Windows ausgelö
 
Windows sendet dir auch erst ein WM_CLOSE.

himitsu 14. Apr 2010 11:27

Re: Unterscheidung OnClose durch Nutzer oder Windows ausgelö
 
Zitat:

Zitat von Luckie
Windows sendet dir auch erst ein WM_CLOSE.

Das ist ja gemein. :cry:

RSE 14. Apr 2010 15:14

Re: Unterscheidung OnClose durch Nutzer oder Windows ausgelö
 
Vielleicht hilft noch mehr Hintergrundinfo:

Ich will mir einen Logger basteln, der mitloggt, wann Win gestartet wird und wann es beendet wird. Der Logger kommt in die Autostart, somit kann er den Startzeitpunkt selbständig loggen. Nun will ich es bei OnClose zur Tasktray minimieren und aus der Taskleiste verschwinden lassen. So weit so gut, ist kein Problem mit TJvTrayIcon. Wenn ich nun aber im Taskmanager die Application in der Registerkarte Anwendungen (also nicht Prozess abschießen!) beenden will (was ja sicher der Beendigungsanfrage beim Herunterfahren gleicht), dann minimiert sich der Logger nur. Die Herunterfahren-Zeit nehme und speichere ich in Mainform.OnDestroy.

Wenn ich also eure Diskussion richtig verfolgt habe, muss ich sowieso mit Windows-Messages arbeiten. Dann kann ich ja auch auf WM_ENDSESSION mit Application.Terminate reagieren und eine Variable setzen, damit ich in OnClose Bescheid weiß. Das werde ich morgen früh mal ausprobieren.

hoika 14. Apr 2010 16:30

Re: Unterscheidung OnClose durch Nutzer oder Windows ausgelö
 
Hallo,

Zitat:

Der Logger kommt in die Autostart
Damit loggt er aber nicht den Windows-Start, sondern den Zeitpunkt der Anmeldung.

Ich würde das in "geplante Tasks" machen.
Dort gibt es auch ein "Ausführen beim Windows-Start", "Ausführen beim Windows-Beenden".


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 Uhr.
Seite 1 von 2  1 2      

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 by Thomas Breitkreuz