【问题标题】:WM_TIMER messages suppressed when clicking and holding the mouse over windows X buttonWM_TIMER 消息在单击并按住 Windows X 按钮时被抑制
【发布时间】:2011-11-08 16:34:36
【问题描述】:

我正在开发一款客户端需要继续处理 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 消息触发?

【问题讨论】:

    标签: c++ windows windows-messages


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我能想到几种可能性。

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

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

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

      【讨论】:

        【解决方案3】:

        考虑使用定期waitable timer。它将在单独的线程中独立运行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-02-04
          • 1970-01-01
          • 1970-01-01
          • 2011-03-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多