2011-08-27 71 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