WM_DESTROY、WM_CLOSE IMessageFilter をバイパスする
-
21-08-2019 - |
質問
以下は私のメッセージフィルターです。
bool MyFilter::PreFilterMessage(Message %m){
switch(m.Msg){
case WM_CLOSE:
case WM_DESTROY:
case WM_NCDESTROY:
case WM_QUIT:
Debug::WriteLine(L"Gone!");
break;
case WM_MOUSEMOVE:
Debug::WriteLine(L"A mouse! Catch! Catch!!! CATCH!!");
break;
}
return false;
}
ほとんどのメッセージを問題なくフィルタリングしていることを確認しました。ただし、ウィンドウの閉じるボタンをクリックした後にディスパッチされたメッセージを受信しません(WM_CLOSE
, WM_DESTROY
, WM_NCDESTROY
そして WM_QUIT
)。どうしてこれなの?
解決
IMessageFilter.PreFilterMessage() は、メッセージ キュー内のメッセージに対してのみ呼び出されます。WM_CLOSE のようなメッセージは、SendMessage() を使用して WndProc() に直接送信され、キューをバイパスします。また、WM_ACTIVATE、WM_GETTEXT などのメッセージも受信されません。イベントを入力する、それだけです。
所属していません StackOverflow