我制作了小游戏,并且在低优先级窗口消息方面存在一些问题,这些消息不断地从系统发送并阻止运行游戏逻辑的代码。
我创建我的消息循环是这样的:
bool Window::SystemRoutineAndCheckQuit() {
::MSG msg;
while( ::PeekMessage( &msg, nullptr, 0, 0, PM_REMOVE ) ) {
if( msg.message == WM_QUIT ) {
::UnregisterClass( registeredClassName, ::GetModuleHandle( nullptr ) );
DLOG( lg ) << "Exit from system loop" << DLOG_END;
return false;
}
::TranslateMessage( &msg );
::DispatchMessage( &msg );
}
return true;
}
//....
while( window.SystemRoutineAndCheckQuit() ) {
// do all render and logic
}
即在每一帧之前,我想处理来自窗口的所有消息,然后,当队列为空时,执行所有逻辑。我注意到,当窗口调整大小时,我一次又一次地收到相同的消息 WM_SIZING 并且当仍然按下鼠标按钮时队列永远不会为空(即使窗口的大小没有从 previos 调用中改变,我也会收到具有相同窗口坐标的消息)。所以它阻止执行我的代码。
是否有任何其他消息保持 Windows 消息队列不为空,以及处理所有没有低优先级(如 WM_SIZING)的消息的最佳方法是什么?
我在 Windows 8 上测试它。
PS:我需要调整窗口大小,所以我不想通过改变样式来禁止它。
编辑:对于不正确的描述问题感到抱歉,但发现了实际发生的事情(以及为什么我之前尝试通过限制处理的消息数量来修复它,或者在连续两次获得相同消息时通过中断消息处理将不会成功)。从 PeekMessage 我收到消息 WM_NCLBUTTONDOWN 并且在此消息之后程序不会从 ::DispatchMessage 返回并阻止线程继续执行,直到鼠标被释放。当在 DispatchMessage 中编程时,我的处理程序会重复 WM_SIZING 或 WM_MOVING(独立于从消息处理程序函数返回的内容(DefWindowProc 的结果,TRUE(消息已处理)或 0)。