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/)
-   -   Delphi Wie beendet Windows mein Programm (https://www.delphipraxis.net/13841-wie-beendet-windows-mein-programm.html)

F.W. 27. Dez 2003 20:34


Wie beendet Windows mein Programm
 
Wenn man den Computer ausschaltet oder den Benutzer abmeldet, werden ja alle Programme geschlossen, nur meins nicht. Ich hab' Win XP Home und wenn ich dann abmelden drücke, werden Firewall und alles andere, was sonst noch so läuft beendet, dann kommt dieser blaue Bildschirm, wo draufsteht, dass man abgemeldet wird...
Und dann hab' ich auf einmal den Desktop wieder und mein Programm läuft noch.

Info zu meinem Programm:
Mein Programm ist ein Chatprogramm, was immer in der Tystemtray auf Nachrichten vom großen Computer wartet.
Das ganze habe ich mit einem RxTrayIcon umgesetzt.

--------------------------------------------------

Als ich nachgedacht habe,bin ich auf folgende Lösung gekommen:
Ich fange die NAchricht ab, die Windows beim Herunterfahren an die noch laufenden Programme sendet und reagiere darauf...

Probleme:
1.Schickt Windows überhaupt Nachrichten oder nimmt es einfach die Anwendungen aus dem Speicher...
2.Welche Nachricht schickt Windows?
3.Wie fange ich die ab?

Wenn ich mir jetzt das eben verfasste anschaue fällt mir auf, dass ich noch verdammt viel zu lernen habe :cry:

Aber dafür, dass ich mir das ganze selbst beibringe, hab ich's schon ziemlich weit geschafft! :-D


Bitte helft mir!!!!

Mirilin 27. Dez 2003 20:39

Re: Wie beendet Windows mein Programm
 
:hi:

Vielleicht hilft Dir dies hier .

mfg Tobias

Uncle Cracker 27. Dez 2003 20:39

Re: Wie beendet Windows mein Programm
 
Guck mal bei den Schweizern: Der Link ins Ausland

Oder in der DP per Suche: Hier im Forum suchenwindows verhindern, der erste Eintrag

F.W. 27. Dez 2003 21:12

Re: Wie beendet Windows mein Programm
 
Super! Ich werd's gleichmal ausprobieren, aber ich denke schon, dass was dabei ist!

Ich schreib dann spätestens morgen [Jetzt: 27.12.03; 22-11], ob's geklappt hat! :mrgreen:

Luckie 28. Dez 2003 04:18

Re: Wie beendet Windows mein Programm
 
Das Problem ist bekannt bei der Komponentensammlung, habe ich schon öfters gelesen.

Robert Marquardt 28. Dez 2003 06:00

Re: Wie beendet Windows mein Programm
 
Prinzipiell muss man auf WM_QUERYENDSESSION und WM_ENDSESSION reagieren.
Man muss eventuell offene Forms schliessen, da eine zweite offene Form
sonst alle Bemuehungen sich zu benehmen verhindert.
Wenn man ein FormDestroy hat und sich bei WM_ENDSESSION beendet wird FormDestroy
nicht mehr aufgerufen, da kein WM_QUIT mehr kommt.

F.W. 28. Dez 2003 12:05

Re: Wie beendet Windows mein Programm
 
Ich hab' das gestern abend mal bei runterfahren ausprobiert:

Mein Programm wird tatsächlich beendet, allerdings werden danach keine anderen Programme mehr beendet. Mein Programm fängt die Nachricht den anderen Programmen weg.

Wenn man dann nochmals auf runterfahren oder abmelden klickt geht es dann allerdings.

Wie kann jetzt dieses Wegfangen verhindern?

Edit: Ich habe die procedure WMENDQUERYSESSION in das Hauptformular eingebunden, das ist auch das, welches in der Systray schlummert. In der procedure wird dann Application.Terminate aufgerufen.

Robert Marquardt 28. Dez 2003 12:42

Re: Wie beendet Windows mein Programm
 
Ein Close auf das eigene Hauptformular sollte genuegen.
Zeig mal deine WMQueryEndSession und WMEndSession Methoden.

Luckie 28. Dez 2003 12:49

Re: Wie beendet Windows mein Programm
 
Du musst eins oder True zurückgeben, um Windows zu sagen, dass es weiter runterfahren darf.

F.W. 29. Dez 2003 12:28

Re: Wie beendet Windows mein Programm
 
Mein Quellcode:
Delphi-Quellcode:
procedure TTitel.WMQueryEndSession(var M: TWMQueryEndSession);
begin
 inherited;
 Application.Terminate;
end;
Zitat:

Du musst eins oder True zurückgeben, um Windows zu sagen, dass es weiter runterfahren darf.
Wie soll ich True zurückgeben?

fkerber 29. Dez 2003 13:14

Re: Wie beendet Windows mein Programm
 
Hi!

Ich glaube so:

Delphi-Quellcode:
procedure TTitel.WMQueryEndSession(var M: TWMQueryEndSession);
begin
inherited;
Application.Terminate;
Msg.Result:=1;
end;

Ciao fkerber

Robert Marquardt 29. Dez 2003 13:26

Re: Wie beendet Windows mein Programm
 
Delphi-Quellcode:
procedure TTitel.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
  inherited;
  Msg.Result := 1;
end;
So ist es richtig.

F.W. 29. Dez 2003 13:33

Re: Wie beendet Windows mein Programm
 
Das habe ich nach Luckies Posting versucht, es hat nicht geklappt. Aber ich probier's nochmal, ich hab's nur schnell in Eile gemacht.

Robert Marquardt 29. Dez 2003 15:31

Re: Wie beendet Windows mein Programm
 
Terminate solltest du nie aufrufen.
WM_QUERYENDSESSION fragt ob alle Programme mit Runterfahren einverstanden sind.
Mit 1 sagst du ja.
Erst bei WM_ENDSESSION sollte das Programm sich beenden. Es kann ja eines der anderen Programme nein sagen und dann hat man sich faelschlich beendet.

F.W. 4. Jan 2004 16:09

Re: Wie beendet Windows mein Programm
 
Ok, ich hab's jetzt in den Griff bekommen!

Ich dachte es liegt an dem Icon, aber in wirklichkeit lag es an den Netzwerkcomponenten, die sich in einem anderen Formular befanden. Das Hauptformular reagiert jetzt auf die Message WM_QUERYENDSESSION und ruft Free für die 3 Componenten auf und schließt sich danach.

Bei WM_ENDSESSION hat das nicht geklappt, mein Programm beendet sich zwar , aber Windows fährt nachher nicht weiter runter, woran liegt das?

Vjay 5. Jan 2004 09:07

Re: Wie beendet Windows mein Programm
 
Ich vermute, dass du Komponenten benutzt, die für sich Fensterhandle (was dein Hauptformular auch hat) erzeugen. Sobald sie dieses tun bekommen sie ebenfalls die WM_QUERYEND etc gesendet, wenn der Programmierer vergessen hat darauf richtig zu antworten - wird es mit dem Herunterfahren nichts. Dass passiert oft aus Flüchtigkeit, oder aus schlechtem Programmierstil :-P. Denn eigentlich brauchst du die query-end etc. nicht abfangen, da der Default-Handler (die Standard-Fensterprozedur) diese Nachrichten korrekt verarbeitet. Vermute dass die Komponenten die Nachrichten nicht weiterleiten, schau dir deine Komp. mal genauer an. Ansonsten ist das auch keine "Gute"-Lösung in der query-end die Komponenten zu "zerstören". Man weiss nie in welcher Reihenfolge Windows die Botschaften sendet und zukunftige versionen etc.etc. versuch den Fehler bei den Komponenten zu beheben und informiere den Programmierer darüber, damit andere nicht das gleiche machen müssen.

MFG
Volker

F.W. 5. Jan 2004 18:34

Re: Wie beendet Windows mein Programm
 
Zitat:

Zitat von Vjay
...und informiere den Programmierer darüber, damit andere nicht das gleiche machen müssen.

Wie meinst du das? Ich bin doch der Programmierer. Ich werde im nächsten Posting mal die 3 Componenten aufzählen, geht jetzt nur nicht, weil der Computer auf dem die Dateien liegen aus ist und ich will ihn nicht nur deswegen anschalten.

Aber danke! Das gibt mir Hoffnung eine gute Lösung zu finden!


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