Entwickler-Ecke
Windows API - Erkennen, ob PC heruntergefahren oder neu gestartet wird
af70 - Mo 16.08.04 00:07
Titel: Erkennen, ob PC heruntergefahren oder neu gestartet wird
Hallo,
ich würde gerne einen Reboot- bzw. Shutdown-Vorgang abfangen, einige Prozeduren durchführen und diesen dann fortsetzen. Durch WM_QUERYENDSESSION kann man wohl erkennen, dass das System heruntergefahren wird, jedoch nicht, ob es neu gestartet wird.
Weiss jemand, ob man es erkennen kann, dass ein Reboot (Neustart) initiiert wurde?
Danke
Andreas
BenBE - Mo 16.08.04 00:27
WM_QUERYENDSESSION liefert dazu leider keine Informationen. Womit es auf jeden Fall gehen müsste, wer ein API Hook (ExitWindowsEx-Funktion überschreiben), ist aber sicherlich zu hoch gegriffen.
P.S.: Was is'n eigentlich der Unterschied zwischen Runterfahren und Neustarten, außer, dass beim Herunterfahren vor dem Neustart (meist) etwas mehr Zeit vergeht?
af70 - Mo 16.08.04 00:38
Zitat: |
P.S.: Was is'n eigentlich der Unterschied zwischen Runterfahren und Neustarten, außer, dass beim Herunterfahren vor dem Neustart (meist) etwas mehr Zeit vergeht?
|
Stimmt, nur leider weiss ich nicht wie lange der User warten möchte und ob er die Power-Taste drücken will.
BenBE - Mo 16.08.04 00:54
Naja,, im Allgemeinen sollte sowieso beim Runterfahren des Systems (egal ob Neustart oder nicht) ein Programm nicht länger als noch unbedingt notwendig arbeiten.
Wenn ich mich richtig erinnere wartet Windows standardmäßig 10 Sekunden auf eine Antwort bei der WM_QueryEndSession Botschaft (also, bis zur Rückgabe der Abarbeitung). Der Wert geht in der Registry einzustellen (müsste genauen Schlüssel raussuchen).
Aber im Endeffekt sollten sich deine Bearbeitungen auf <5 Sekunden beschrenken. Dass ist so der Wert, den ich als Anwender noch so akzeptieren tu. Alles was mir länger als diese Zeit die Möglichkeit zum Shutdown durch Windows bietet (weils hängt oder zu lange braucht) wird gekillt. Windows 2000 bietet für sowas nämlich schöne Funktionen an ;-)
af70 - Mo 16.08.04 01:03
Zitat: |
BenBE: ...wartet Windows standardmäßig 10 Sekunden auf eine Antwort bei der WM_QueryEndSession Botschaft... |
Könnte reichen, muss ich erstmal checken. Danke.
Delete - Mo 16.08.04 02:17
Wo ist für dein Programm ein Unterschied zwischen eine Reboot und einem Runterfahren des Systems? Macht es für dein Programm einen Unterschied, ob der Computer jetzt 1 Sekunde aus ist oder 24 Stunden?
af70 - Mo 16.08.04 10:25
Luckie, der Unterschied ist, dass man nach einem Shutdown die Power-Taste drücken muss, siehe oben.
Delete - Mo 16.08.04 10:35
Nö. Ich drücke nie die Powertaste zum Stzarten des Rechners, bei mir reicht eine druck auf eine beliebige Taste der Tastatur zum Starten des Rechners aus.. Und wie merkt dein Programm, ob der Rechner mit der Powertaste gestartet wurde oder ob es sich um einen Neustart handelt?
af70 - Mo 16.08.04 10:40
Oder so. Auf jeden Fall ist ein Benutzereingriff notwendig. Mein Programm muss es nicht beim Starten des Systems merken, sondern beim Beenden des Systems.
Delete - Mo 16.08.04 11:23
Und warum? Ob nur Reboot oder Shutdown, die Vorgänge beim Runterfahren unterscheiden sich nicht.
af70 - Mo 16.08.04 11:38
Hat jemand eine Idee?
Delete - Mo 16.08.04 12:04
Ich verstehe es immer noch nicht. WARUM musst du wissen, ob das System runtergefahren und ausgeschaltet wird, oder ob ein Neustart erfolgt?
af70 - Mo 16.08.04 12:37
Ich will ja den Vorgang abbrechen und kurze Zeit später mit ExitWindowsEx selber übernehmen. Dazu muss ich aber wissen was initiiert wurde (was ich selber weiter machen muss) runterfahren oder neu starten.
Ich kann ja nicht den PC runterfahren, obwohl ein Neustart initiiert wurde. Der User würde sich doch verarscht fühlen.
Delete - Mo 16.08.04 16:22
Wie lange dauern denn die Aktionen? ERs sollte kein Problem sein
WM_QUERYENDSESSION abzufangen, seinen eigenen Code auszuführen und dann TRUE zurückzugeben.
af70 - Di 17.08.04 12:23
BenBE:
Zitat: |
Wenn ich mich richtig erinnere wartet Windows standardmäßig 10 Sekunden auf eine Antwort bei der WM_QueryEndSession Botschaft (also, bis zur Rückgabe der Abarbeitung). Der Wert geht in der Registry einzustellen (müsste genauen Schlüssel raussuchen). |
Luckie:
Zitat: |
ERs sollte kein Problem sein WM_QUERYENDSESSION abzufangen, seinen eigenen Code auszuführen und dann TRUE zurückzugeben. |
Geht leider nicht. Ich muss einen Bereinigungsprozess starten. Diseser wird im Shutdown-Modus nicht gestartet. Ich muss also bei WM_QUERYENDSESSION ein False zurückgeben. Und mein Bereinigungsprozess soll dann mit dem Runterfahren weitermachen.
Also wie kann man unterscheiden, ob der PC gerade runtergefahren oder neu gestartet wird?
raziel - Di 17.08.04 12:43
af70 hat folgendes geschrieben: |
Also wie kann man unterscheiden, ob der PC gerade runtergefahren oder neu gestartet wird? |
Nicht mit WM_QUERYENDSESSION und auch nicht mit WM_ENDSESSION. Einzige Möglichkeit dürfte sein, was BenBE schon vorgeschlagen hat:
BenBE hat folgendes geschrieben: |
WM_QUERYENDSESSION liefert dazu leider keine Informationen. Womit es auf jeden Fall gehen müsste, wer ein API Hook (ExitWindowsEx-Funktion überschreiben),(...) |
raziel
Udontknow - Di 17.08.04 12:45
Hallo!
Eine Lösung habe ich auch nicht, aber vielleicht erläuterst du einfach mal, was genau du mit diesem "Reinigungsprozess" machen willst, und warum das unbedingt nur bei einem Neustart möglich ist, nicht jedoch bei einerm Shutdown. Ich bin da wohl genauso irritiert wie Luckie und kann mir absolut keinen Fall vorstellen, wo das so sein müsste...
Cu,
Udontknow
af70 - Di 17.08.04 13:18
Mein Reinigungsprozess beendet u.a. Prozesse und dienste in einer bestimmten Reihenfolge, weil zwischen diesen Client-Server-Beziehungen bestehen, um einen sauberen Abschluss zu haben. Grund: Bei Diensten kann es durch Abhängigkeiten gesteuert werden, die Anderen beendet Windows durcheinander.
Der Reinigungsprozess soll beim Runterfahren und beim Neustart durchgeführt werden, das ist keine Frage. Die Frage ist, was der Reinigungsprozess nach der Bereinigung tun soll: runterfahren oder neustarten?
Klar, ich könnte diese Bereinigung auch von dem Modul aus machen, welches die Nachricht WM_QUERYENDSESSION bekommt, aber dann muss ich da diese Funkionalität implementieren und das ist unnötiger Balast, wenn es schon ein fertiges Modul gibt.
Ich muss mich wohl informieren, wie ein API Hook geht. Kann mir jemand einen Link schicken?
raziel - Di 17.08.04 13:25
af70 hat folgendes geschrieben: |
Ich muss mich wohl informieren, wie ein API Hook geht. Kann mir jemand einen Link schicken? |
Ein wirklich einfaches, verständliches und leicht modifizierbares API Hook-Beispiel findest Du im SwissDelphiCenter-Forum:
http://www.swissdelphicenter.ch/de/forum/viewtopic.php?t=2755
raziel
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!