我想在将它们发送到我的窗口过程之前,在消息循环中读出消息。我尝试阅读的大多数邮件都是正确读取的,但是当我关闭窗口时,无法读取WM_CLOSE
或WM_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?怎么样?
答案 0 :(得分:2)
消息循环仅查看发布到消息队列的消息。并非所有消息都通过消息队列。 WM_DESTROY
就是这样一条消息。你应该做的是处理窗口过程中的消息,这样你就可以看到窗口收到的每条消息,无论消息是否通过消息队列。
如果您需要查看自己没有创建的窗口的消息,或者对于具有系统提供的窗口过程的标准窗口,您可以subclass the window使用SetWindowSubclass()
。