2011-11-08 40 views
2

我正在開發一款遊戲,其中客戶端需要繼續處理Windows消息或者可以利用遊戲。爲了在窗口重新調整大小和拖動事件期間解決這個問題,我們有一個WM_TIMER消息每隔50ms觸發一次,這將重新啓動主事件循環。WM_TIMER消息在單擊並將鼠標停留在窗口X上時被抑制X按鈕

問題是,當用戶單擊並保留窗口客戶端的X或最小化按鈕時,此技術不起作用。 (。所以他們沒有完成點擊,他們只是暫停該客戶端)

使用間諜++,我看到最後消息是:

<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

某些系統事件(如系統菜單)(如您的情況)或窗口大小調整會阻止常規窗口消息被處理一段時間。您需要重新考慮您的架構,並可能在輔助線程中運行定期操作。在那裏你可以使用WaitForSingleObject或者Sleep()來代替基於消息的定時器。

+0

這樣做很有意義,謝謝。 – Zyrca

3

我能想到幾個可能性。

  1. 當按下按鍵發生在非客戶區域,系統代碼可以運行其自己的消息循環,直到鬆開按鈕。此消息循環可能不派遣WM_TIMER消息。

  2. 我相信WM_TIMER是特殊的,它是一個較低優先級的消息。只有在沒有其他東西需要檢索時才從隊列中檢索WM_TIMER(類似於WM_PAINT)。 Windows定時器最終會觸發,並且永遠不會超過指定的時間,但是如果您需要定期檢測信號,它們並不是非常可靠。

正如另一個人建議,你可能需要依靠第二個線程來保持活着。

0

考慮使用期刊waitable timer。它將在獨立的線程中獨立運行。

相關問題