【问题标题】:Determine priority of a window message确定窗口消息的优先级
【发布时间】:2011-11-05 04:20:29
【问题描述】:

有没有办法以编程方式检查窗口消息在其消息队列中的优先级?

例如:一些窗口消息,WM_PAINTWM_TIMER 已知具有最低优先级,并被放置在具有最高优先级的消息之后。

我正在寻找一些东西,您可以通过它确认两条消息中的哪一条具有最低或最高优先级,或者哪条消息将首先发送或最后发送?

【问题讨论】:

  • 不管这是否可能,取决于您使用 API 合同未涵盖的内容的消息顺序。这使您的程序容易在未来版本的 Windows(或 WINE 等其他实现)中被破坏。不要这样做。

标签: c winapi message-queue


【解决方案1】:

这不是它的工作方式,Windows 消息没有附加优先级。它主要取决于消息的生成方式。消息循环按以下顺序分派消息:

  • 首先,使用 SendMessage() 生成的任何消息都按照调用的顺序发送
  • 接下来,使用 PostMessage() 生成并按队列顺序存储在消息队列中的任何消息
  • 接下来,从窗口状态合成的任何消息。 WM_TIMER、WM_PAINT 和 WM_MOUSEMOVE 属于此类。

'synthesized from the window state' 子句使 WM_PAINT 和 WM_TIMER 看起来具有低优先级。以及为什么快速移动鼠标不会使消息队列充满鼠标消息。但是,这不是唯一的,例如,您可以调用 UpdateWindow() 来强制发送 WM_PAINT 消息,使其以“高优先级”进行调度。

【讨论】:

  • 我不知道合成消息的概念。你知道我在哪里可以找到更多信息吗?我读过 Petzold,但我不记得讨论过这些细微差别。
  • @David - 抱歉,这是我十多年前读过的东西的混合物。我不记得这是在什么杂志上发表的,它们早就不存在了。
  • @David:对于 WM_TIMER,MSDN 文档 msdn.microsoft.com/en-us/library/ms644902(v=vs.85).aspx -“消息由 GetMessage 或 PeekMessage 函数发布”意味着它是按需生成的,而不是直接发布到队列中实际计时器到期。 WM_PAINT 似乎也存在类似的措辞,尽管它在那里不太明确。此外,support.microsoft.com/kb/96006 补充说:“WM_TIMER 和 WM_PAINT 消息可以被认为是布尔切换”,暗示了这一点。我不认为它在 Petzold 中,但它偶尔会出现在 Raymond Chen 的博客上。
  • 对这个答案的一个问题:WM_KEYDOWN 的评级是否也低于使用 PostMessage 发送的 WM_COMMAND 消息?
【解决方案2】:

顺序在GetMessage / PeekMessage 文档中定义:

如果未指定过滤器,则消息按以下方式处理 顺序:

  • 已发送消息
  • 已发布消息
  • 输入(硬件)消息和系统内部事件
  • 发送消息(再次)
  • WM_PAINT 消息
  • WM_TIMER 消息

【讨论】:

    猜你喜欢
    • 2012-05-26
    • 2015-02-11
    • 1970-01-01
    • 2012-05-31
    • 2018-11-20
    • 2014-02-08
    • 2012-09-04
    • 2015-12-23
    相关资源
    最近更新 更多