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