2011-08-27 64 views
3

有没有什么办法通过编程来检查消息队列中窗口消息的优先级?确定窗口消息的优先级

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

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

+2

无论是否有可能,取决于您使用API​​合约未涵盖的消息的顺序。这使得你的程序很容易在未来的Windows版本中崩溃(或者像WINE这样的其他实现)。不要这样做。 –

回答

17

这并不是如何工作,Windows消息没有附加优先级。这主要取决于消息的生成方式。消息循环调度的顺序信息:

  • 首先用的SendMessage()在将呼叫作了
  • 下,使用于PostMessage生成的任何消息()和存储在所述的顺序分派所产生的任何消息消息队列,按照队列顺序,接下来是从窗口状态合成的任何消息。 WM_TIMER,WM_PAINT和WM_MOUSEMOVE适合这个类别。

'从窗口状态合成'子句是什么让WM_PAINT和WM_TIMER看起来具有低优先级。以及为什么快速移动鼠标不会用鼠标消息填充消息队列。然而,这不是排他性的,例如你可以调用UpdateWindow()来强制发送WM_PAINT消息,使其以“高优先级”进行调度。

+1

我不知道合成消息的概念。你知道我在哪里可以找到更多?我读过Petzold,但我不记得正在讨论这种细微差别。 –

+1

@大卫 - 对不起,这是我读了十五年前的东西的混合物。我不记得这些杂志是在哪里发表的,它们早已不复存在。 –

+1

@David:对于WM_TIMER,MSDN文档http://msdn.microsoft.com/en-us/library/ms644902(v=vs.85).aspx - “该消息由GetMessage或PeekMessage函数发布”意味着它是按需生成的,而不是由于实际计时器到期而直接发布到队列中。类似的措辞似乎与WM_PAINT存在,虽然它在那里不太明确。此外,http://support.microsoft.com/kb/96006增加:“WM_TIMER和WM_PAINT消息可以被认为是布尔切换”,暗示在这。我认为这不在Petzold,但它偶尔会出现在Raymond Chen的博客上。 – BrendanMcK