![]() |
Hibernate und Standby erkennen
Hab zwar schon einiges gefunden, wie man das Herunterfahren erkennen kann (WINDOWS_SESSION_END und Co.),
allerdings bekommt man nirgends ein Ereignis, wenn der Rechner in den Standby, oder Ruhezustand gefahren wird. Ich würde einfach gerne mein Programm in einen Pausemodus versetzen, wenn derartiges passiert. PS: der MediaPlayer (ich glaub seit v7) kann ja auch sowas. |
Re: Hibernate und Standby erkennen
Folgendes ist nötig, um auf den Standby oder Ruhezustand (Hibernation) reagieren zu können
(inkl. Nachricht, wenn das System aus diesem wieder zurückgeholt wird): Zuerst muss die Windows-Nachrichtenabfrage überschrieben werden:
Delphi-Quellcode:
Die genaue Funktion sieht in der Implementierung so aus:
Form1...
procedure WndProc(var MyMessage: TMessage); override;
Delphi-Quellcode:
In der obigen Funktion gehe ich auf die Anfrage zum Standby und Ruhezustand ein.
procedure TForm1.WndProc(var MyMessage: TMessage);
begin if MyMessage.Msg = WM_POWERBROADCAST then begin // windows powermanagement message if (MyMessage.WParam = PBT_APMQUERYSUSPEND) or (MyMessage.WParam = PBT_APMQUERYSTANDBY) then begin // windows want to go into standby or hibernation mode // Hier hin, was getan werden muss, bevor Windows in den Standby darf, // z.B. Netzwerk- oder Datenbankverbindungen trennen, Timer abstellen, etc. MyMessage.Result := 1; // allow standby/hibernation // MyMessage.Result := BROADCAST_QUERY_DENY; // deny standby/hibernation end else if (MyMessage.WParam = PBT_APMRESUMECRITICAL) or (MyMessage.WParam = PBT_APMRESUMESUSPEND) or (MyMessage.WParam = PBT_APMRESUMESTANDBY) then begin // windows returns from standby or hibernation // Hier z.B. Verbindungen wiederherstellen end; end; inherited WndProc(MyMessage); end; Durch abfragen von PBT_APMSUSPEND oder PBT_APMSTANDBY kann man noch etwas ausführen, kurz bevor der PC definitiv in den Standby geht. Sollten die Konstanten nicht verfügbar sein, hier die Deklaration:
Delphi-Quellcode:
Näheres zu den einzelnen Konstanten gibts im Windows SDK unter WM_POWERBROADCAST
PBT_APMQUERYSUSPEND = $0000;
PBT_APMQUERYSTANDBY = $0001; PBT_APMQUERYSUSPENDFAILED = $0002; PBT_APMQUERYSTANDBYFAILED = $0003; PBT_APMSUSPEND = $0004; PBT_APMSTANDBY = $0005; PBT_APMRESUMECRITICAL = $0006; PBT_APMRESUMESUSPEND = $0007; PBT_APMRESUMESTANDBY = $0008; PBTF_APMRESUMEFROMFAILURE = $00000001; PBT_APMBATTERYLOW = $0009; PBT_APMPOWERSTATUSCHANGE = $000A; PBT_APMOEMEVENT = $000B; PBT_APMRESUMEAUTOMATIC = $0012; Nachtrag: Windows wartet was um die 10-20 Sekunden auf die Antwort deine Programms, von daher würde ich nix großartig rechenintensives machen ;) |
Re: Hibernate und Standby erkennen
Das geht auch einfacher ;)
Einfach in den Klassenrumpf von TForm1 (bzw. der hauptform halt)
Delphi-Quellcode:
Darin kann man dann alles machen, was man auch in der Windowproc hätte machen können. Entzerrt einiges.
procedure WMPowerBroadcast(var Msg: TMessage); message WM_POWERBROADCAST;
|
Re: Hibernate und Standby erkennen
Jo, funktioniert perfekt :)
dankö :angel: |
Re: Hibernate und Standby erkennen
Hi!
Den Code würde ich gerne in die Codelib übernehmen, allerdings scheint es ein Problem mit Windows Vista zu geben. Im MSDN findet sich Zitat:
Zitat:
![]() Ein Test unter Vista zeigt auch, dass oben stehender Code wohl nicht mehr funktioniert... Kann das jemand widerlegen oder hat vllt. anderen/funktionierenden Code, der auch unter Vista funktioniert? Ciao, Frederic |
Re: Hibernate und Standby erkennen
tatsächlich wird unter Vista das Abfangen von standby- und sleepmode nicht mehr supportet.
schade... ...oder kann jemand das gegenteil behaupten ? |
Re: Hibernate und Standby erkennen
Wieso hat Windows dieses denn entfernt o.O
ein Programm, welches "ausversehn" ein Runterfahren (Standby/Hypernate) verhindert, kann so doch garnicht mehr darauf reagieren und die Behinderung beseitigen? |
AW: Hibernate und Standby erkennen
Wie sieht es denn z.Z. aus? Läuft der oben vor 3 Jahren genannte Code immernoch weder unter Vista noch Windows 7? Gibt es alternativen?
|
AW: Hibernate und Standby erkennen
Laut MSDN gibt es jetzt
![]()
Delphi-Quellcode:
procedure WMPowerBroadcast(var Msg: TMessage); message WM_POWERBROADCAST;
Delphi-Quellcode:
Allerdings hab ich nichts gefunden um festzustellen, ob das System in den Ruhezustand oder Standby wechselt. APMSUSPEND kommt bei beiden und gibt laut MSDN keine Auskunft darüber.
//Beispiel-Routine
procedure TfrmMain.WMPowerBroadcast(var Msg: TMessage); begin case Msg.wParam of PBT_APMSUSPEND: begin //System wird in einen Energiesparmodus versetzt end; PBT_APMRESUMESUSPEND: begin //System ist wieder aufgewacht end; PBT_APMRESUMEAUTOMATIC: begin //Nach dem Aufwachen wurde eine Benutzeraktivität festgestellt end; end; end; Hat jemand eine Idee wie man das rausfinden kann? |
AW: Hibernate und Standby erkennen
Ist das wichtig, ob Standby oder Ruhezustand? Windows 7 wechselt in der Standardeinstellung "Energie sparen" in den Ruhezustand UND Standbymodus gleichzeitig. Und wacht dann aus dem Standby oder -wenn zwischendrin der Strom weg war- aus dem Ruhezustand wieder auf.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz