Hallo liebes Forum, ich brauch mal wieder eure hilfe. Ich würde gerne ein kleines programm coden, am liebsten mit gcc mingw compiler. Das programm soll erkennen wenn der computer heruntergefahren wird und dann noch schnell einen kleinen String über die RS232 Schnittstelle aussenden. Prinzipiell stellt das ja kein großes problem da, aber wie kannn ich erkennen, bzw. abfragen wann Windows runterfährt. Als ansatz habe ich mir überlegt: Wenn Windows runterfährt, sagt es ja allen noch offenen Programmen "bescheid" das sie noch die möglichkeit haben sich ordentlich zu beenden, kann ich nicht irgendwie an dieser Stelle einharken und noch schnell einen befehl über RS232 senden? Aber wie komme ich an diese Stelle? Oder gibt es eine bessere Lösung? Ich habe auch gehört das es einen timer gibt der abläuft bis Windows runter fährt, kann ich eventuell abfragen ob dieser aufgeladen ist? Vielen Dank schonmal für eure Hilfe
Für Konsolapplikationen kannst Du mit SetConsoleCtrlHandler(1) eine Rückruffunktion(2) anmelden, die vom System beim Herunterfahren mit dem Flag CTRL_SHUTDOWN_EVENT aufgerufen wird. Fensterbasierte Anwendungen bekommen WM_QUERYENDSESSION(3) gesandt und können dies entsprechend auswerten, aber nicht zwischen Herunterfahren und Benutzerabmeldung unterscheiden. 1) http://msdn.microsoft.com/en-us/library/ms686016(v=vs.85).aspx 2) http://msdn.microsoft.com/en-us/library/ms683242(v=vs.85).aspx 3) http://msdn.microsoft.com/en-us/library/aa376890(v=vs.85).aspx
Geht auch ganz ohne programmieren einfach mit Eventghost.
Erst einmal vielen Dank an euch für die schnellen Antworten, wenn das über Eventghost funktionieren würde, währe das echt super, weil ich dieses Programm sowieso am laufen habe. Ich möchte nämlich über meinen HTPC meinen Fernseher ein und ausschalten können ;)... Also das senden vie RS232 habe ich ja gefunden, aber irgendwie finde ich nichts was mir bescheid sagt ob Windows runter fährt damit ich das senden auslösen kann.... @ Firefly irgendwie steige ich da nicht ganz durch, also ich rufe beim initzilisieren die Funktion wie folgt auf SetConsoleCtrlHandler(NULL,1); So dann schreibe ich eine Funktion die aufgerufen werden soll, wenn das System runterfährt... Wo übergebe ich diese denn dann? Damit das System weiss welche funktion das ist? Gruß und Danke Dominik
Dominik schrieb: > also ich rufe beim > initzilisieren die Funktion wie folgt auf SetConsoleCtrlHandler(NULL,1); Und warum tust Du das? Welche Bedeutung hat der erste Parameter, für den Du hier NULL übergibst?
1 | A pointer to the application-defined HandlerRoutine function to |
2 | be added or removed. This parameter can be NULL. |
Zwar steht da, daß da auch NULL angegeben werden kann, aber das hat eine andere Bedeutung:
1 | If the HandlerRoutine parameter is NULL, a TRUE value causes the |
2 | calling process to ignore CTRL+C input, and a FALSE value |
3 | restores normal processing of CTRL+C input. |
Mit der Behandlung von Ctrl+C willst Du Dich aber gar nicht beschäftigen.
Dominik schrieb: > ich rufe beim > initzilisieren die Funktion wie folgt auf SetConsoleCtrlHandler(NULL,1); Imho: Nein. Eher so:
1 | #include sowienoch
|
2 | #include <windows.h> |
3 | |
4 | BOOL WINAPI HandlerRoutine(DWORD dwCtrlType) |
5 | {
|
6 | if(dwCtrlType==CTRL_SHUTDOWN_EVENT) |
7 | //tu was
|
8 | }
|
9 | |
10 | int main ... |
11 | {
|
12 | SetConsoleCtrlHandler(HandlerRoutine,TRUE) |
13 | ...
|
14 | }
|
ABER:
1 | CTRL_LOGOFF_EVENT |
2 | Note that this signal is *received only by services*. Interactive applications are terminated at logoff, so they are not present when the system sends this signal. |
3 | |
4 | CTRL_SHUTDOWN_EVENT |
5 | A signal that the system sends when the system is shutting down. Interactive applications are not present by the time the system sends this signal, therefore it can be *received only be services* in this situation. Services also have their own notification mechanism for shutdown events. For more information, see Handler. |
http://msdn.microsoft.com/en-us/library/ms683242%28v=vs.85%29.aspx
Okay, also muss ich dann da den Zeiger auf die Funktion übergeben, die beim shutdown aufgerufen werden soll? Danke
Also aus deinem aber interpretiere ich, das es nur als Dienst funktioniert.. Ist das richtig? Gruß
Dominik schrieb: > aber irgendwie finde ich nichts was mir > bescheid sagt ob Windows runter fährt damit ich das senden auslösen > kann.... Hier stehts: http://www.eventghost.org/forum/viewtopic.php?f=1&t=1230 in den letzten 2 Posts unten.
Ist das richtig, die exe muss als dienst laufen, damit das funktioniert wie im Beispiel von "abc"? Gruß
Sowas geht auch über die Group Policies von Windows. Einfach gpedit.msc aufrufen und dann unter "Computer Configuration"->"Windows Settings"->"Scripts (Startup/Shutdown)" eintragen. Logon/Logoff Aktionen stehen unter "User Configuration"->"Windows Settings"->"Scripts (Logon/Logoff)"
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.