電源断とサスペンドの検出
最近のキーボードには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. |