WM_DESTROY,WM_CLOSE绕过IMessageFilter

Agn*_*ian 1 .net windows message-queue imessagefilter winforms

以下是我的消息过滤器:

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;
}
Run Code Online (Sandbox Code Playgroud)

我确认我正在过滤大多数邮件而没有问题.然而,我无法接收窗口的关闭按钮后,派出任何消息点击(WM_CLOSE,WM_DESTROY,WM_NCDESTROYWM_QUIT).为什么是这样?

Han*_*ant 6

IMessageFilter.PreFilterMessage()仅针对消息队列中的消息进行调用.像WM_CLOSE这样的消息通过SendMessage()直接发送到WndProc(),它们绕过队列.您也不会收到WM_ACTIVATE,WM_GETTEXT等消息.输入事件,就是它.