为什么我不能在窗口过程外获得WM_DESTROY或WM_CLOSE消息?

时间:2014-09-28 14:39:31

标签: c++ winapi message-loop

我想在将它们发送到我的窗口过程之前,在消息循环中读出消息。我尝试阅读的大多数邮件都是正确读取的,但是当我关闭窗口时,无法读取WM_CLOSEWM_DESTROY邮件,因为它们似乎从未收到过。这就是我的所作所为:

void Framework::Run(){
while(running){

    MSG msg;
    while(PeakMessage(&msg, NULL, 0, 0)){
        TranslateMessage(&msg);
        switch(msg.message){
            case WM_DESTROY:
                PostQuitMessage(0);
                break;
            case WM_QUIT:
                running = false;
                break;
        //...other cases...
        }
        DispatchMessage(&msg);
    }
//...
}
}

我在第一种情况下设置断点,但即使我关闭窗口(通过点击' X'),断点也永远不会被击中。但是,当我在窗口过程中检查WM_DESTROY时,它会被读取并且每件事情都很顺利。为什么不在外面?

此类消息是否直接发送到窗口proc?怎么样?

1 个答案:

答案 0 :(得分:2)

消息循环仅查看发布到消息队列的消息。并非所有消息都通过消息队列。 WM_DESTROY就是这样一条消息。你应该做的是处理窗口过程中的消息,这样你就可以看到窗口收到的每条消息,无论消息是否通过消息队列。

如果您需要查看自己没有创建的窗口的消息,或者对于具有系统提供的窗口过程的标准窗口,您可以subclass the window使用SetWindowSubclass()