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 отправляются непосредственно в WndProc() с помощью SendMessage(), они обходят очередь.Вы также не будете получать сообщения типа WM_ACTIVATE, WM_GETTEXT и т.д.Входные события, вот и все.
Не связан с StackOverflow