2012-11-29 177 views
-2

我要做的事很簡單,如果移動不移動或點擊,我想在1秒後隱藏鼠標光標。我錯過了什麼WM_MOUSEMOVE?

我搜索了一下,看到有人推薦使用WM_MOUSEMOVE。然而,在我的應用程序中,WM_MOUSEMOVE只是檢測鼠標是否在客戶區域。如果是,應用程序會不斷收到WM_MOUSEMOVE。我讀過MSDN頁面,但我仍然感到困惑。

+0

我同意Windows消息很混亂。但WM_MOUSEMOVE包含消息發送時的鼠標座標。因此,每次捕獲事件時,將座標與前一條消息(以全局值存儲)的座標進行比較,如果它們相同且至少1秒,則隱藏光標,但如果它們不同,則鼠標無論你用什麼來追蹤時間,它都會重置。 – jonhopkins

+0

這就是WM_MOUSEMOVE的含義?爲什麼我看到人們只是簡單地檢測WM_MOUSEMOVE會做什麼? – LeOpArD

回答

0

該建議是正確的。你需要做的是定義一個計時器(例如,觸發WM_TIMER消息的計時器)。 您可以在第一次鼠標移動(WM_MOUSEMOVE)中激活它。如果鼠標移動不會在您爲計時器定義的時間間隔內發生,WM_TIMER事件將觸發,然後您可以隱藏鼠標。

每次WM_MOUSEMOVE事件觸發時,只需重新啓動計時器(使用其專用的API)。所以WM_MOUSEMONVE事件可以防止計時器過期。如果WM_MOUSEMOVE停止到達(因爲您不再移動鼠標),計時器將在沒有中斷的情況下進行打勾,直到它消失並觸發。

+0

這不是問題所在。我的意思是,如果鼠標位於客戶區域,我總是會收到WM_MOUSEMOVE,而不管真正的移動動作如何。 – LeOpArD

+1

如果鼠標沒有移動並且窗口層次結構穩定,那麼如果您仍然收到一個持續的WM_MOUSEMOVE消息流,很可能是由於[第三方所謂的增強軟件](http:// blogs .msdn.com/b/oldnewthing/archive/2009/06/17/9763416.aspx),或者可能是一個錯誤的鼠標驅動程序。 –

+0

@jonhopkins,我明白了。但是,還有一件事,因爲我是新的stackoverflow,我不知道如何設置你的「評論」作爲問題的答案。 – LeOpArD

1

使用WM_SETCURSOR。

對於與光標相關的作品使用WM_SETCURSOR。此消息是爲此目的而製作的。您提到的客戶區域表明您可能還需要使用SetCapture API。

另一種方式(或更現代的做法)是使用TrackMouseEvent。它提供了WM_MOUSEHOVER

+0

如果鼠標不移動,WM_SETCURSOR通常不會被髮送,所以它不適用於超時場景。 –

+0

@Mark Ooch,你是對的。我只想寫一些關於處理光標的警告,而不考慮setcusor消息。 – 9dan

+0

使用WM_SETCURSOR替換WM_MOUSEMOVE後得到完全相同的不需要的結果。我記得在這裏看到一個帖子,說這兩條消息通常是成對的。 – LeOpArD