電源断とサスペンドの検出


最近のキーボードにはWake up、Sleep、Power Offキーを持つものがあります。これらのキーを誤って押すといきなり電源が切れたり、スリープしたりして困ることがありますが、これらのキーが押されたかは、WM_POWERBROADCASTメッセージを監視することで知ることができます(このメッセージは後からWin32に追加されたメッセージなので多くのアプリケーションはこのメッセージに対して反応しません)。

WM_POWERBROADCASTメッセージのハンドラに渡されるパラメータ(TMessageレコードのWParam)には、WM_POWERBROADCASTが発生した原因が格納されます。もし、特定の発生原因にだけ反応したいときは、これ(WParam)を調べて処理を行います。

WM_POWERBROADCASTに対して、そのまま処理を続行させるときはハンドラはTRUE(Win32の場合-1)を返します。処理を続行しない(つまりスリープや電源断させない)ときは、BROADCAST_QUERY_DENYを返します(TMessageレコードのResultに代入)。

次にサンプルを示します。

unit AcpiTest;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

const
	PBT_APMBATTERYLOW = 9;
	PBT_APMSUSPEND = 4;
    PBT_APMPOWERSTATUSCHANGE = 10;
	BROADCAST_QUERY_DENY = $424D5144;
type
  TForm1 = class(TForm)
    Label1: TLabel;
  private
    { Private 宣言 }
  public
    { Public 宣言 }
    procedure WMPowerBoadcast(var msg: TMessage);  message WM_POWERBROADCAST;

  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WMPowerBoadcast(var msg: TMessage);
begin
   MessageDlg('WM_POWERBROADCAST message received.', mtWarning, [mbOK], 0);
   msg.Result := BROADCAST_QUERY_DENY;
end;

end.