System - Message für Windows-Shutdown abfangen



  • Hi,

    trau mich kaum diese Frage zu stellen.
    Ich hab eine Routine geschrieben , die bei Programmende Sachen speichert, Speicher freigibt, Kontrolldateien löcscht und schreibt ...

    Das soll passieren egal woher das Beende-Signal kommt.(vorallem beim Herunterfahren von Windows)

    Z.Z. stehet sie unter MainForm::FormClose, aber das stimmt wohl so nicht. Wenn ich über ALT-F4 oder Taskmanager beenden will reagiert das Programm nicht.

    Was muss ich ändern damit sich mein Programm immer sauber schließt?

    MfG

    W.Prall

    [ Dieser Beitrag wurde am 12.12.2002 um 20:45 Uhr von Jansen editiert. ]



  • vielleicht in FormDestroy, obwohl ich glaube nicht, dass es eine möglichkeit gibt den taskmanager umzugehen. da wird das programm brutal aus dem speicher gerissen



  • hallo,

    mir fällt da auf schnelle nur die api-möglichkeit ein. die message heisst WM_SYSCOMMAND. damit du die abgreifen kannst muss du ein botschaftsmakro definieren:

    class TForm1 : public TForm
    {
    __published:   // Von der IDE verwaltete Komponenten
    private:
       void __fastcall WMSysCommand(TWMSysCommand &Msg);
    public:      // Anwender-Deklarationen
       BEGIN_MESSAGE_MAP
               MESSAGE_HANDLER(WM_SYSCOMMAND, TWMSysCommand, WMSysCommand)
            END_MESSAGE_MAP(TForm)
       __fastcall TForm1(TComponent* Owner);
    };
    
    // die implementation in der cpp sieht dann folgendermassen aus:
    
    void __fastcall TForm1::WMSysCommand(TWMSysCommand &Msg)
    {
        if (Msg.CmdType == SC_TASKLIST)
            {
            ...   
            }
            TForm:   :Dispatch(&Msg);
    }
    
    /*
            SC_CLOSE            Closes the window.
            SC_CONTEXTHELP      Changes the cursor to a question mark with a pointer.
                                If the user then clicks a control in the dialog box,
                                the control receives a WM_HELP message.
            SC_DEFAULT          Selects the default item; the user double-clicked the
                                window menu.
            SC_HOTKEY           Activates the window associated with the application-
                                specified hot key. The low-order word of lParam
                                identifies the window to activate.
            SC_HSCROLL          Scrolls horizontally.
            SC_KEYMENU          Retrieves the window menu as a result of a keystroke.
            SC_MAXIMIZE         (or SC_ZOOM)   Maximizes the window.
            SC_MINIMIZE         (or SC_ICON)   Minimizes the window.
            SC_MONITORPOWER     Windows 95 only: Sets the state of the display. This
                                command supports devices that have power-saving features,
                                such as a battery-powered personal computer.
            SC_MOUSEMENU        Retrieves the window menu as a result of a mouse click.
            SC_MOVE             Moves the window.
            SC_NEXTWINDOW       Moves to the next window.
            SC_PREVWINDOW       Moves to the previous window.
            SC_RESTORE          Restores the window to its normal position and size.
            SC_SCREENSAVE       Executes the screen saver application specified in the
                                [boot] section of the SYSTEM.INI file.
            SC_SIZE             Sizes the window.
            SC_TASKLIST         Executes or activates Windows Task Manager.
            SC_VSCROLL
    */
    

    im kommentar stehen alle möglichkeiten dieser botschaft.
    das

    TForm:  :Dispatch(&Msg);
    

    benötigst du, damit du die standardfunktionalität des fensters gewährleistest, ohne dies könntest du das fenster nich einmal bewegen.
    ich hoffe das hilft dir weiter.
    mfg
    andik



  • Auswerten der Windowsmessage WM_QUERYENDSESSION, die vom System vor dem Herunterfahren an alle Applikationen gesendet wird.
    Sobald diese Message empfangen wird, muss sich Deine Anwendung
    z.B. mit Close(); beenden, damit wird auch der Destruktor ordnungsgemass aufgerufen.

    protected:
      BEGIN_MESSAGE_MAP
         VCL_MESSAGE_HANDLER(WM_QUERYENDSESSION, TMessage, OnShutdown)
      END_MESSAGE_MAP(TForm)
      void __fastcall OnShutdown(TMessage & Msg);
    
    void __fastcall TForm1::OnShutdown(TMessage &Msg)
    {
      // Dateien Schliessen ...
      // ...
    
      TObject:: Dispatch(&Msg);
      Close();
    }
    


  • Danke für die Tips.

    Ich hab zwar keine Ahnung was der Code bedeutet, aber Pawels-Version scheint auf Anhieb funktioniert zu haben.

    MfG

    W.Prall


Anmelden zum Antworten