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.aspx

    HTH,
    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()-Funktion

    NMUDP1->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.


Anmelden zum Antworten