我正在开发一款游戏,客户需要继续处理Windows消息,否则游戏就会被利用。为了在窗口重新调整大小和拖动事件期间解决此问题,我们有一条WM_TIMER
消息,每50ms触发一次,这将重新启动主事件循环。
问题是当用户点击并保持窗口客户端的X或最小化按钮时,此技术不起作用。 (所以他们没有完成点击,他们只是停止了客户。)
使用Spy ++,我看到的最后一条消息是:
<00731> 00160D3C P WM_NCLBUTTONDOWN nHittest:HTCLOSE xPos:1150 yPos:178
<00732> 00160D3C P WM_MOUSEMOVE fwKeys:MK_LBUTTON xPos:1014 yPos:-23
在我移动鼠标之前没有任何操作,在我放开鼠标按钮之前没有WM_TIMER
消息。
所以问题是,当我将鼠标放在窗口上时,X按钮是否有一些我可以关闭以使客户端再次移动的东西?或者我能做的事情,我们的&#34;看门狗&#34;消息发送WM_TIMER
消息?
答案 0 :(得分:4)
某些系统事件(如系统菜单(如您的情况))或窗口大小调整会使常规窗口消息暂停处理一段时间。您需要重新考虑您的体系结构,并可能在辅助线程中运行定期操作。在那里你可以使用WaitForSingleObject或Sleep()而不是基于消息的计时器。
答案 1 :(得分:3)
我可以想到几种可能性。
当非客户区域上发生按钮关闭时,系统代码可能正在运行自己的消息循环,直到释放按钮。此消息循环可能不会分派WM_TIMER消息。
我认为WM_TIMER的特殊之处在于它是一个优先级较低的消息。只有在没有其他东西需要检索时才会从队列中检索WM_TIMER(类似于WM_PAINT)。 Windows定时器最终会触发,并且永远不会超过指定时间段,但如果您需要定期检测心跳,它们就不太可靠。
正如另一个人建议的那样,你可能需要依靠第二个线程来保持活力。
答案 2 :(得分:0)
考虑使用期刊waitable timer。它将在一个单独的线程中独立运行。