【问题标题】:WM_DESTROY, WM_CLOSE bypassing IMessageFilterWM_DESTROY, WM_CLOSE 绕过 IMessageFilter
【发布时间】:2010-10-15 04:51:51
【问题描述】:

下面是我的消息过滤器:

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)。这是为什么呢?

【问题讨论】:

    标签: .net windows winforms message-queue imessagefilter


    【解决方案1】:

    IMessageFilter.PreFilterMessage() 仅对消息队列中的消息调用。 WM_CLOSE 之类的消息通过 SendMessage() 直接发送到 WndProc(),它们绕过队列。您也不会收到 WM_ACTIVATE、WM_GETTEXT 等消息。输入事件,仅此而已。

    【讨论】:

    • WM_LBUTTONDOWN 怎么样?在哪里可以找到哪些消息直接发送到 WndProc 以及哪些消息发布到消息队列?
    • WM_LBUTTONDOWN 通常是发布的,而不是发送的。这取决于生成消息的代码。
    猜你喜欢
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    相关资源
    最近更新 更多