Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Hibernate und Standby erkennen (https://www.delphipraxis.net/81507-hibernate-und-standby-erkennen.html)

himitsu 28. Nov 2006 13:27


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.

H4ndy 28. Nov 2006 15:27

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:
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 ;)

DGL-luke 28. Nov 2006 15:33

Re: Hibernate und Standby erkennen
 
Das geht auch einfacher ;)

Einfach in den Klassenrumpf von TForm1 (bzw. der hauptform halt)

Delphi-Quellcode:
procedure WMPowerBroadcast(var Msg: TMessage); message WM_POWERBROADCAST;
Darin kann man dann alles machen, was man auch in der Windowproc hätte machen können. Entzerrt einiges.

himitsu 4. Dez 2006 16:46

Re: Hibernate und Standby erkennen
 
Jo, funktioniert perfekt :)

dankö :angel:

fkerber 22. Aug 2007 11:47

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:

The following messages are not supported on any of the operating systems listed in the Requirements section:


PBT_APMQUERYSTANDBY
PBT_APMQUERYSTANDBYFAILED
PBT_APMSTANDBY
PBT_APMRESUMESTANDBY
Zitat:

Requirements
Client
Requires Windows Vista, Windows XP, or Windows 2000 Professional.

Server
Requires Windows Server 2008, Windows Server 2003, or Windows 2000 Server.
Quelle: http://msdn2.microsoft.com/en-us/library/aa373247.aspx

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

r_amse_s 5. Dez 2007 15:02

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 ?

himitsu 5. Dez 2007 15:21

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?

Der_Ventilator 14. Nov 2010 17:43

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?

sar3th 17. Dez 2010 13:35

AW: Hibernate und Standby erkennen
 
Laut MSDN gibt es jetzt PBT_APMSUSPEND. In meinen Tests auf Windows 7 hat das auch zuverlässig funktioniert :)
Delphi-Quellcode:
procedure WMPowerBroadcast(var Msg: TMessage); message WM_POWERBROADCAST;
Delphi-Quellcode:
//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;
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.
Hat jemand eine Idee wie man das rausfinden kann?

Der_Ventilator 17. Dez 2010 15:21

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 23:16 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz