WM_DESTROY, WM_CLOSE в обход IMessageFilter - PullRequest
1 голос
/ 24 марта 2009

Ниже мой фильтр сообщений:

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). Почему это?

1 Ответ

6 голосов
/ 24 марта 2009

IMessageFilter.PreFilterMessage () вызывается только для сообщений в очереди сообщений. Сообщения типа WM_CLOSE отправляются напрямую в WndProc () с помощью SendMessage (), они обходят очередь. Вы также не получите такие сообщения, как WM_ACTIVATE, WM_GETTEXT и т. Д. Введите события, вот и все.

...