PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : WM_QUERYENDSESSION auswerten



CYSER
05.12.2010, 13:50
Hey leute,

ich möchte eigentlich nur detecten ob sich der Pc runterfährt um dann eine entsprechende Aktion auszuführen.. nun zu meinem problem ich bin auf WM_QUERYENDSESSION gestoßen womit das angeblich möglich sein soll ^_^...

Ich frage mich nur wie ich das implementieren soll.. hat jemand sich damit schonmal beschäftigt? Ich hab eine Formlose - application und muss anscheinend zusätzlich ein top-level-window erstellen ( RegisterServiceCtrlHandlerEx ?) damit er die Message gesendet kriegt. Doch irgendwie verstehe ich diese 2-3 Beispiele die es im Netz gibt nicht.

hier z.B. : C/C++ Forum :: Auf Herunterfahren reagieren (http://www.c-plusplus.de/forum/275168)

Erbitte Hülfe :(

EBFE
05.12.2010, 13:54
Für Konsole gibt es SetConsoleCtrlHandler Function (Windows) (http://msdn.microsoft.com/en-us/library/ms686016(v=VS.85).aspx)


The system generates CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, and CTRL_SHUTDOWN_EVENT signals when the user closes the console, logs off, or shuts down the system so that the process has an opportunity to clean up before termination. Console functions, or any C run-time functions that call console functions, may not work reliably during processing of any of the three signals mentioned previously. The reason is that some or all of the internal console cleanup routines may have been called before executing the process signal handler.

CYSER
05.12.2010, 13:56
Habe aber keine console :E, die frage ist auch garnicht welche funktionen es gibt sondern eher wie ich das implementiere da ich mit sowas noch keine Erfahrung habe :X

G36KV
05.12.2010, 16:28
Guck hier:
Tutorial: A Simple Window (http://www.winprog.org/tutorial/simple_window.html)


LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_QUERYENDSESSION:
//........
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}


Wie in dem verlinkten Thread schon steht: du kannst auch ein unsichtbares Fenster erzeugen oder du hast eine Konsole und dann brauchst du die Funktion von EBFE

CYSER
05.12.2010, 17:51
Gibt es noch irgendeine andere möglichkeit das zu machen? Ich will keine Form erstellen :Z... kann damit nicht wirklich umgehen und auch nicht die Nerven dass zu lernen, wenn ich die form habe.. und darin die while(..) funktion ist.. wo soll ich dann bitte die nachfolgenden Funktionen reinpacken in sowas wie Form-Load? Damit habe ich mich in C/C++ noch nicht beschäftigt..


int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow )
{

CreateWindow.. bla

while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}da können ja nicht die Funktionen hinter wenn da nur das fenster created wird :D

blackberry
05.12.2010, 18:13
Man muss sich auch nicht alles vorkauen lassen. Allgemein würde ich dir ans Herz legen dir die Posts von G36KV auch durchzulesen - das sind sie nämlich oft auch wert - so auch hier.
Hättest du das nämlich getan, wäre dir der Link sofort ins Auge gefallen -.-

CYSER
05.12.2010, 18:58
Ich habs mir durchgelesen und auch getestet, dann hatte ich ne form die sogar unsichtbar war. Die Frage war nur wie ich jetzt weite Prozeduren aufrufe da diese komische while-schleife mich daran hinderte.

Problem ist einfach dass ich mir da schnell was zusammen pasten wollte ohne es zu verstehen ( Windows-forms)

blackberry
05.12.2010, 20:01
Bei einer Forms-Anwendung willst du ja eigentlich nur etwas machen, wenn der Benutzer es "provoziert", d.h. ein Event auslöst, welches du mit der Message-Loop abfängst und in der WindowsProcedure behandelst.

Ansonsten musst du halt vor der Schleife einen neuen Thread starten - ist doch logisch o_O