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.
dasTForm: :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