Programm verhindert den Windowsneustart/ Herunterfahren
-
Hallo Leute,
ich habe eine Applikation entwickelt, welche sich nach dem Start
als Tray-Icon in der Taskleiste plaziert.Das Problem ist, dass mein Programm den Windowsneustart sperrt. Es lässt sich
von Windows einfach nicht automatisch schließen.Ich habe schon die ganze Funktionalität des Programms auskommentiert, so dass
es nur eine leere Applikation ist. Der Effekt ist der gleiche: alle anderen
Trayicons werden durch Windows brav geschlossen, nur mein Programm bremst alles aus.Hat jemand schon mal das gleiche Problem gehabt?
-
Hier hast Du den SystenEvent auf den Du mit dem beenden Deines Programms reagieren kannst:
http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.sessionending(VS.71).aspx
Gruß myerscola
-
danke für die schnelle Antwort.
ich hatte schon mal den Eingang der Windowsnachricht
"WM_QUERYENDSESSION" ausgewertet, und als Reaktion darauf
Close() und Terminate() ausgeführt.
Daraufhin wurde meine Applikation zwar beendet, aber es folgte
kein Neustart bzw. Herunterfahren. Auch wenn ich noch mal auf "Neustarten"
gedrückt habe.Ich bin eigentlich der Meinung, dass das Schließen der Applikationen von Windows
verwaltet werden sollte.
-
Welchen Rückgabewert verwendest Du bei WM_QUERYENDSESSION?
Bzw. wird die Nachricht WM_QUERYENDSESSION am Ende an DefWindowProc() weitergeleitet?Bei falschem Rückgabewert hast Du nämlich (versehentlich) den Neustart bzw. Shutdown blockiert!
(Zur Info: Unter Win Vista und Win 7 kannst Du dies nicht mehr blockieren)sonic_1233 schrieb:
Ich bin eigentlich der Meinung, dass das Schließen der Applikationen von Windows verwaltet werden sollte.
Nein, das ist Deine Aufgabe!
Denn schließlich weiß Windows ja nicht, ob und wenn ja welche (offenen bzw. nichtgespeicherten) Daten noch zu sichern sind.Siehe auch:
"Application termination when user logs off" http://blogs.msdn.com/michen/archive/2008/04/04/Application-termination-when-user-logs-off.aspx
und
"Windows doesn't close windows when a user logs off; that's your call" http://blogs.msdn.com/oldnewthing/archive/2008/04/21/8413175.aspxHTH,
Martin
-
Mein Quellcode sieht so aus:
// Ausschniit aus der Klassendeklaration // ===================================== class TForm1 : public TForm { public: BEGIN_MESSAGE_MAP VCL_MESSAGE_HANDLER(WM_QUERYENDSESSION, TMessage, OnShutdown) END_MESSAGE_MAP(TForm) }; // Funktionsdefinition // =================== void TForm1::OnShutdown(TMessage & Msg) { if( Msg.Msg == WM_QUIT || Msg.Msg == WM_QUERYENDSESSION ) { // Empfangene Botschaft in eine geeignete Botschaftenroutine übergeben: TObject:: Dispatch(&Msg); // Applikation schließen: Close(); } }
Ich habe jetzt die Ursache gefunden. Es lag nämlich an der UDP-Komponente,
welche ständig Daten sendete. Ich habe in der OnShutdown()-FunktionNMUDP1->Free();
hinzugefügt, und jetzt geht das.
Danke für die Links.
-
Hallo
Bitte beim nächsten Posten von Quellcode hier im Forum die cpp-Tags benutzen : sfds
bis bald
akari
-
nicht gut...
Wenn ich mein Programm ausführe und "dinge" tue (welch ich nicht weiß welche es sind) fährt mein Pc auch nicht mehr runter, aber den oder die übeltäter zu finden würde mich Jahre dauern, gibt es da eine Lösung ?
-
Tim06TR schrieb:
nicht gut...
Wodrauf beziehst du das ? Er hat doch den Grund gefunden.
Das ist auch der einzigst vernünftige Ansatz oder willst du deinen eigenen Prozess immer mit Gewalt abschiessen ?
-
ER hat das Hingekriegt,
aber ich
Ja mit Gewalt abschießen wär ne möglichkeit, aber es nervt wenn der benutzer immer dexplore schließen muss, bzw das auch nichtmal hilft.
Aber wie soll ich das machen ?
-
Je nachdem was du in deinem Programm machst.
Warum und wo blockiert dein Programm ?
Ansonsten musst du halt auf die Message WM_QUERYENDSESSION reagieren.