Du kannst nicht prüfen, ob gerade der Standby oder Ruhezustand an ist, da dein Programm in dieser Zeit "lahmgelegt" ist
Du kannst aber reagieren, wenn der PC in einen dieser Modi wechselt.
Dazu einfach folgende Funktion zum Formular hinzufügen:
Delphi-Quellcode:
type Form1...
public
procedure WndProc(var MyMessage: TMessage); override;
...
Und so dann aufbauen:
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
// 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
// Hier z.B. Verbindungen wiederherstellen
end;
end;
inherited WndProc(MyMessage);
end;
Falls die Konstanten fehlen:
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;