# [C++] Abfangen von WM_QUERYENDSESSION / WM_ENDSESSION



## Crazy Bytes (4. November 2002)

Hallo, ich bräuchte mal ein bißchen Hilfe. Ich brauche ein Progamm das eine MessageBox-Meldung ausgibt wenn Windows herunterfährt. Kann mir einer vielleicht sagen wie ich unter MS Visual C++ 6.0 die
WM_QUERYENDSESSION bzw. WM_ENDSESSION-Meldung abfange.

Ich habe folgendes getan:
1. MFC-Anwendung (EXE) - Dialogfeldbasierend erstellt
2. Timer "ID_TIMER" eingerichtet (Intervall 1000 ms)
3. OnTimer-Script:

void  CApplicationName::OnTimer(UINT nIDEvent) 
{
&nbsp;&nbsp;&nbsp;&nbsp;if  (nIDEvent == ID_TIMER)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if  (WM_QUERYENDSESSION)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KillTimer(ID_TIMER);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox("Nachricht", "Titel:", MB_OK + MB_ICONEXCLAMATION);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnOK();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;CDialog::OnTimer(nIDEvent);
}

Das Programm läßt sich ohne Probleme kompilieren, aber die Meldung erscheint sofort und das Programm wird direkt danach beendet. Kann mir einer sagen wie ich die Meldung richtig abfange?

Bis dann...
CB


----------



## Maximka (20. Januar 2003)

Also Window-Messages kommen nicht in der Funktion OnTimer an.
Die landen alle in der Hauptschleife und werden da verarbeitet.

Die Funktion OnTimer wird auch nur in Folge einer WM_TIMER-Nachricht aufgerufen.

Du musst in dem Window-Assistenten die Message WM_QUERYENDSESSION mit einer Funktion versehen, dann wird es auch klappen.


----------



## Crazy Bytes (20. Januar 2003)

Danke für die Hilfe. Ob Du es glaubst oder nicht ich
habe in sage und schreibe 14 Foren nachgefragt und die
bist der einzige der geantwortet hat.

Ich werde deine Lösung mal probieren...

Bis dann...
CB


----------



## rook (20. Februar 2003)

hier ein beispiel:


```
LRESULT CALLBACK DialogProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

    switch (message) // hier wird die nachricht abgefangen
	{	
		case WM_INITDIALOG:
                        // ...
			return true; 

		case WM_QUERYENDSESSION:
			if(MessageBox(hwnd, "Soll Windows wirklich beendet werden?", "Test", MB_YESNO| MB_ICONQUESTION) == IDYES)
			{
				return false; // windows wird herruntergefahren...
			}
			return true; // windows wird weiterhin ausgeführt...
                ...
         }
```

das ganze ruf ich dann in der WinMain funktion auf, ich benutze noch resource dateien, ist so ähhlich wie in Visual Basic eine form zu erstellen...


```
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,	int nCmdShow)
{ 
	DialogBox (hInstance, MAKEINTRESOURCE(IDD_MYFORM), 0, (DLGPROC) DialogProc);
	return true;
}
```


----------



## Crazy Bytes (21. Februar 2003)

Danke für die Antwort,

damit kann ich sehr gut was anfangen. Ich hoffe damit
ist meine Odyssee nach einer Lösung endlich vorbei.

    
Nahe der Verzweilung habe ich nämlich schon diverse
Ansätze versucht, hat aber außer Enttäuschung und Erfahrung  
leider nichts gebracht, dafür kenne ich mich jetzt besser
mit Abfragen, Erstellen von Dialogen, setzen von Timern, Abändern
von Vordefinierten Funktionen und Klassen aus.

 Wenn diese Lösung funzt schulde ich dir ein Menge.  

Bis dann...
CB


----------



## rook (21. Februar 2003)

was ich oben vergessen hab...

```
LRESULT CALLBACK DialogProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
   ...
   return false;
}
```

die funktion darf nichts zu rück geben..
in dem fall, das du nur eine messagebox verwendest, ist es egal, aber wenn du eine ganze form nutzt (IDD_MYFORM), sieht man sie nicht..


----------

