Einzelnen Beitrag anzeigen

Benutzerbild von H4ndy
H4ndy

Registriert seit: 28. Jun 2003
Ort: Chemnitz
515 Beiträge
 
Delphi XE3 Professional
 
#4

Re: Hibernate und Standby erkennen

  Alt 19. Jan 2009, 12:11
Zitat von himitsu:
der Windows Media Player scheint es aber doch unter Vista dennoch zu kennen, oder kommt das mir nur so vor?
Richtig.

Es geht auch weiterhin unter Vista. Getestet habe ich unter Vista Ultimate SP1 sowie XP Pro SP3.

Ich hab mir eine kleinen Anwendung geschrieben, welche die leicht modifizierte Funktion von DLG-Luke (hier) nutzt:

Delphi-Quellcode:
unit FormMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls,

  GetWindowsVersion;

type
  TfrmMain = class(TForm)
    MemoMessageLog: TMemo;
    StatusBar1: TStatusBar;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure WMPowerBroadcast(var MyMessage: TMessage); message WM_POWERBROADCAST;
  end;

var
  frmMain: TfrmMain;

const
  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;

implementation

{$R *.dfm}

{ TfrmMain }

function TranslatePowerBroadcast(const Msg: Cardinal): string;
begin
  case Msg of
    WM_POWERBROADCAST: Result := 'WM_POWERBROADCAST';
    
    PBT_APMQUERYSUSPEND: Result := 'PBT_APMQUERYSUSPEND';
    PBT_APMQUERYSTANDBY: Result := 'PBT_APMQUERYSTANDBY';

    PBT_APMQUERYSUSPENDFAILED: Result := 'PBT_APMQUERYSUSPENDFAILED';
    PBT_APMQUERYSTANDBYFAILED: Result := 'PBT_APMQUERYSTANDBYFAILED';

    PBT_APMSUSPEND: Result := 'PBT_APMSUSPEND';
    PBT_APMSTANDBY: Result := 'PBT_APMSTANDBY';

    PBT_APMRESUMECRITICAL: Result := 'PBT_APMRESUMECRITICAL';
    PBT_APMRESUMESUSPEND: Result := 'PBT_APMRESUMESUSPEND';
    PBT_APMRESUMESTANDBY: Result := 'PBT_APMRESUMESTANDBY';

    //PBTF_APMRESUMEFROMFAILURE: Result := 'PBTF_APMRESUMEFROMFAILURE';

    PBT_APMBATTERYLOW: Result := 'PBT_APMBATTERYLOW';
    PBT_APMPOWERSTATUSCHANGE: Result := 'PBT_APMPOWERSTATUSCHANGE';

    PBT_APMOEMEVENT: Result := 'PBT_APMOEMEVENT';
    PBT_APMRESUMEAUTOMATIC: Result := 'PBT_APMRESUMEAUTOMATIC';
  else
    Result := 'Unknown Message "'+IntToStr(Msg)+'"';
  end;
end;


procedure TfrmMain.WMPowerBroadcast(var MyMessage: TMessage);
begin
  if MyMessage.Msg = WM_POWERBROADCAST then begin
    MemoMessageLog.Lines.Append('Msg: '+TranslatePowerBroadcast(MyMessage.Msg));
    MemoMessageLog.Lines.Append('WParam: '+TranslatePowerBroadcast(MyMessage.WParam));
    MemoMessageLog.Lines.Append('');
    MemoMessageLog.Lines.SaveToFile(ExtractFileDir(Application.ExeName)+'\Message.log');
    
    // windows powermanagement message
    if (MyMessage.WParam = PBT_APMQUERYSUSPEND) or
       (MyMessage.WParam = PBT_APMQUERYSTANDBY)
    then begin
      // windows wants 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;
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  MemoMessageLog.Lines.Append('Running on:');
  MemoMessageLog.Lines.Append(GetWinVersion);
  MemoMessageLog.Lines.Append('');
end;

end.
(Windowsversion wurde von diesem Code hier ermittelt, hat wohl Probleme mit nem aktuellen Vista)

Heraus kam folgendes:
Code:
Windows Message Log
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Running on:
Microsoft Windows Server 2003, Media Center Edition Service Pack 1 (Build 6001) <-- Ist Vista Ult. SP1

Msg: WM_POWERBROADCAST
WParam: PBT_APMSUSPEND

Msg: WM_POWERBROADCAST
WParam: PBT_APMRESUMEAUTOMATIC

Msg: WM_POWERBROADCAST
WParam: PBT_APMRESUMESUSPEND
Code:
Windows Message Log
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Running on:
Microsoft Windows XP Professional Service Pack 3 (Build 2600)

Msg: WM_POWERBROADCAST
WParam: PBT_APMQUERYSUSPEND

Msg: WM_POWERBROADCAST
WParam: PBT_APMSUSPEND

Msg: WM_POWERBROADCAST
WParam: PBT_APMRESUMESUSPEND

Msg: WM_POWERBROADCAST
WParam: PBT_APMRESUMEAUTOMATIC
Wie man sieht, lässt Vista nur das "Nachfragen um Erlaubnis" weg, benachrichtigt aber weiterhin die Programme. Meiner Meinung nach ein Rückschritt, da ich noch nicht ermitteln konnte, ob und wie lange man Zeit hat da noch was im Programm abzuarbeiten.
Manuel
  Mit Zitat antworten Zitat