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:
Form1...
procedure WndProc(var MyMessage: TMessage); override;
Die genaue Funktion sieht in der Implementierung so aus:
Delphi-Quellcode:
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;
In der obigen Funktion gehe ich auf die Anfrage zum Standby und Ruhezustand ein.
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:
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;
Näheres zu den einzelnen Konstanten gibts im Windows
SDK unter WM_POWERBROADCAST
Nachtrag:
Windows wartet was um die 10-20 Sekunden auf die Antwort deine Programms,
von daher würde ich nix großartig rechenintensives machen