Hier die fertige, leicht geänderte Fassung aus dem ersten Post, welche auch unter Vista greifen sollte:
Delphi-Quellcode:
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
procedure WMPowerBroadcast(var MyMessage: TMessage); message WM_POWERBROADCAST;
end;
Ausführung für 2000, XP, Vista & wahrscheinlich neuer.
Man hat nur noch max. 2 Sekunden Zeit.
Delphi-Quellcode:
procedure TForm1.WMPowerBroadcast(var MyMessage: TMessage);
begin
if MyMessage.Msg = WM_POWERBROADCAST then begin
// windows powermanagement message
if (MyMessage.WParam = PBT_APMSUSPEND) or
(MyMessage.WParam = PBT_APMSTANDBY)
then begin
// Hier hin, was getan werden muss, bevor Windows in den Standby darf,
// z.B. Netzwerk- oder Datenbankverbindungen trennen, Timer abstellen, etc.
// Seit Vista hat man hier nur noch max. 2 Sekunden Zeit was zu erledigen.
MyMessage.Result := 1; // Standby/Ruhezustand erlauben
// MyMessage.Result := BROADCAST_QUERY_DENY; // Standby/Ruhezustand verweigern
end
else
if (MyMessage.WParam = PBT_APMRESUMECRITICAL) or
(MyMessage.WParam = PBT_APMRESUMESUSPEND) or
(MyMessage.WParam = PBT_APMRESUMESTANDBY)
then begin
// Windows kommt aus dem Standby/Ruhezustand wieder.
// Hier z.B. Verbindungen wiederherstellen.
end;
end;
inherited;
end;
Ausführung für 2000 & XP. Vista sendet zu 99%
kein "
QUERY" mehr.
Hier hat man noch ca. 10-20 Sekunden Zeit etwas zu erledigen.
Delphi-Quellcode:
procedure TForm1.WMPowerBroadcast(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.
// Windows wartet ca. 10-20 Sekunden auf die Antwort des Programms.
MyMessage.Result := 1; // Standby/Ruhezustand erlauben
// MyMessage.Result := BROADCAST_QUERY_DENY; // Standby/Ruhezustand verweigern
end
else
if (MyMessage.WParam = PBT_APMRESUMECRITICAL) or
(MyMessage.WParam = PBT_APMRESUMESUSPEND) or
(MyMessage.WParam = PBT_APMRESUMESTANDBY)
then begin
// Windows kommt aus dem Standby/Ruhezustand wieder.
// Hier z.B. Verbindungen wiederherstellen.
end;
end;
inherited;
end;