- PR -

PBT_APMQUERYSUSPENDを拒否できない

1
投稿者投稿内容
がりうむ
会議室デビュー日: 2004/11/16
投稿数: 19
投稿日時: 2004-11-18 04:20
WndProc() を使って、サスペンド要求のメッセージ WM_POWERBROADCAST / PBT_APMQUERYSUSPEND を捕まえて、それを拒否するコードを書こうとしています。MSDNに、BROADCAST_QUERY_DENYを返せばサスペンドは実行されないとあるのでやっているのですが、上手くいきません。メッセージのResultとして返すのが正しいと思うのですが…。
以下に、コードを添付します。また、ためしにIMessageFilterを継承したMessageFilterでも同じことをやってみましたが、どちらも効果がありません。
何が不足なのでしょうか?

private const int WM_POWERBROADCAST=0x0218;
private const int PBT_APMQUERYSUSPEND=0x0000;
private const int BROADCAST_QUERY_DENY=0x424D5144;
protected override void WndProc(ref Message m)
{
switch(m.Msg)
{
case WM_POWERBROADCAST:
Console.WriteLine("WndProc: "+m.ToString());
switch(m.WParam.ToInt32())
{
case PBT_APMQUERYSUSPEND:
{
m.Result = (IntPtr)BROADCAST_QUERY_DENY;
Console.WriteLine("WndProc RET: " + m.ToString());
}
break;
}
break;
}
base.WndProc (ref m);
}

実行結果:
WndProc: msg=0x218 (WM_POWERBROADCAST) hwnd=0xf088e wparam=0x0 lparam=0x1 result=0x0
WndProc RET: msg=0x218 (WM_POWERBROADCAST) hwnd=0xf088e wparam=0x0 lparam=0x1 result=0x424d5144
Prefilt: msg=0x2218 (WM_REFLECT + WM_POWERBROADCAST) hwnd=0xa0870 wparam=0x0 lparam=0x1 result=0x0
Prefilt RET: msg=0x2218 (WM_REFLECT + WM_POWERBROADCAST) hwnd=0xa0870 wparam=0x0 lparam=0x1 result=0x424d5144
WndProc: msg=0x218 (WM_POWERBROADCAST) hwnd=0xf088e wparam=0x4 lparam=0x0 result=0x0
WndProc RET: msg=0x218 (WM_POWERBROADCAST) hwnd=0xf088e wparam=0x4 lparam=0x0 result=0x424d5144
Prefilt: msg=0x2218 (WM_REFLECT + WM_POWERBROADCAST) hwnd=0xa0870 wparam=0x4 lparam=0x0 result=0x0
Prefilt RET: msg=0x2218 (WM_REFLECT + WM_POWERBROADCAST) hwnd=0xa0870 wparam=0x4 lparam=0x0 result=0x424d5144
がりうむ
会議室デビュー日: 2004/11/16
投稿数: 19
投稿日時: 2004-11-18 04:34
すみません、投稿結果を見直しているうちにいきなり自己解決しました。
base.WndProc(ref m)のコールを一番下から一番上に持っていくことで、きちんと拒否されるようになりました。base.WndProc()でResultを書き換えているのですね…。

しかし、WndProcはFormレベルで、MessageFilterはApplicationレベルなので、理想的にはMessageFilterを使って拒否したり、サスペンドまで待たせたりしたいと思っています。何か良い方法は無いでしょうか?
1

スキルアップ/キャリアアップ(JOB@IT)