我要做的事很簡單,如果移動不移動或點擊,我想在1秒後隱藏鼠標光標。我錯過了什麼WM_MOUSEMOVE?
我搜索了一下,看到有人推薦使用WM_MOUSEMOVE。然而,在我的應用程序中,WM_MOUSEMOVE只是檢測鼠標是否在客戶區域。如果是,應用程序會不斷收到WM_MOUSEMOVE。我讀過MSDN頁面,但我仍然感到困惑。
我要做的事很簡單,如果移動不移動或點擊,我想在1秒後隱藏鼠標光標。我錯過了什麼WM_MOUSEMOVE?
我搜索了一下,看到有人推薦使用WM_MOUSEMOVE。然而,在我的應用程序中,WM_MOUSEMOVE只是檢測鼠標是否在客戶區域。如果是,應用程序會不斷收到WM_MOUSEMOVE。我讀過MSDN頁面,但我仍然感到困惑。
該建議是正確的。你需要做的是定義一個計時器(例如,觸發WM_TIMER消息的計時器)。 您可以在第一次鼠標移動(WM_MOUSEMOVE)中激活它。如果鼠標移動不會在您爲計時器定義的時間間隔內發生,WM_TIMER事件將觸發,然後您可以隱藏鼠標。
每次WM_MOUSEMOVE事件觸發時,只需重新啓動計時器(使用其專用的API)。所以WM_MOUSEMONVE事件可以防止計時器過期。如果WM_MOUSEMOVE停止到達(因爲您不再移動鼠標),計時器將在沒有中斷的情況下進行打勾,直到它消失並觸發。
這不是問題所在。我的意思是,如果鼠標位於客戶區域,我總是會收到WM_MOUSEMOVE,而不管真正的移動動作如何。 – LeOpArD
如果鼠標沒有移動並且窗口層次結構穩定,那麼如果您仍然收到一個持續的WM_MOUSEMOVE消息流,很可能是由於[第三方所謂的增強軟件](http:// blogs .msdn.com/b/oldnewthing/archive/2009/06/17/9763416.aspx),或者可能是一個錯誤的鼠標驅動程序。 –
@jonhopkins,我明白了。但是,還有一件事,因爲我是新的stackoverflow,我不知道如何設置你的「評論」作爲問題的答案。 – LeOpArD
使用WM_SETCURSOR。
對於與光標相關的作品使用WM_SETCURSOR。此消息是爲此目的而製作的。您提到的客戶區域表明您可能還需要使用SetCapture
API。
另一種方式(或更現代的做法)是使用TrackMouseEvent
。它提供了WM_MOUSEHOVER。
我同意Windows消息很混亂。但WM_MOUSEMOVE包含消息發送時的鼠標座標。因此,每次捕獲事件時,將座標與前一條消息(以全局值存儲)的座標進行比較,如果它們相同且至少1秒,則隱藏光標,但如果它們不同,則鼠標無論你用什麼來追蹤時間,它都會重置。 – jonhopkins
這就是WM_MOUSEMOVE的含義?爲什麼我看到人們只是簡單地檢測WM_MOUSEMOVE會做什麼? – LeOpArD