2

我正在开发一个游戏,客户端需要继续处理 Windows 消息,否则该游戏可以被利用。为了在窗口重新调整大小和拖动事件期间解决这个问题,我们有一个WM_TIMER每 50 毫秒触发一次的消息,它将重新启动主事件循环。

问题是当用户单击并按住窗口客户端的 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 按钮上的状态时,是否可以关闭某些东西来让客户端再次移动?或者我可以做些什么来让我们的“看门狗”WM_TIMER消息触发?

4

3 回答 3

4

某些系统事件,例如系统菜单(如您的情况)或窗口大小调整会在一段时间内停止处理常规窗口消息。您需要重新考虑您的架构,并可能在辅助线程中运行定期操作。在那里,您可以使用 WaitForSingleObject 或仅使用 Sleep() 而不是基于消息的计时器。

于 2011-11-08T16:37:14.960 回答
3

我能想到几种可能性。

  1. 当按钮按下发生在非客户区时,系统代码可能会运行自己的消息循环,直到按钮被释放。此消息循环可能不会发送 WM_TIMER 消息。

  2. 我相信 WM_TIMER 的特殊之处在于它是一个较低优先级的消息。WM_TIMER 仅在没有其他内容可检索时才从队列中检索(类似于 WM_PAINT)。Windows 计时器最终会触发,并且永远不会早于指定的时间段,但如果您需要定期心跳,它们就不是很可靠。

正如另一个人所建议的那样,您可能需要依靠第二个线程来保持活力。

于 2011-11-08T16:52:42.287 回答
0

考虑使用周期性等待计时器。它将在单独的线程中独立运行。

于 2011-11-08T16:54:31.990 回答