2013-10-07 91 views
1

我有通過處理MouseMove事件更新2 NumericUpDowns當前鼠標座標的自定義控件。「鬼」 MouseMove事件

但是我遇到了一個奇怪的情況,即使這種情況不應該發生(我關閉了我的無線鼠標並禁用了觸控板),也會觸發MouseMove事件。因此,即使鼠標不移動,也會發生MouseMove

我做了一個簡單的檢查和核實,這些「鬼」之間的鼠標指針的MouseMove事件的立場不會改變。我利用這個優勢來確保處理事件的方法只在指針實際移動時被調用,所以我已經能夠滿足我的應用程序的要求。

但是,我仍然感到困惑,因爲我不明白當所有鼠標/觸控板被禁用時,會觸發MouseMove事件。看看Visual Studio中的調用堆棧,在我看來,MouseMove事件的觸發是「真正的」,就好像鼠標確實移動了一樣,而不像它是由應用程序的其他部分觸發的(例如模擬MouseMove)。

有關可能是什麼原因的任何建議?謝謝!

編輯:繼景景的建議,我修改了代碼,每次檢測爲MouseMove消息時打印一個字符串。我注意到,當鼠標關閉並且指針懸停在控件上時,當我按Alt-Tab在應用程序之間切換時,將打印該字符串。也許這與正在重繪的應用程序有關?

+0

知道是否有實際的MouseMove,嘗試重寫'WndProc'並添加此代碼'如果(m.Msg ==在0x200)System.Diagnostics.Debug.Print(「鼠標移動!!!!!!! !!!「);',我想不會有任何'Mouse MOVE !!!!! ...'打印出來。 –

+0

感謝您的建議,不幸的是「鼠標移動!!!!!」被打印。 如果我什麼都沒做,沒有打印。但是,當我使用Alt-Tab在Windows 7上切換應用程序時,「Mouse MOVE !!!!!」打印幾次。只有當鼠標指向懸停控件時纔會發生這種情況。 這可能是由於某些原因重新繪製窗口引起的? – elnigno

+0

兩個想法:[A]你有沒有觸摸屏設備?他們會在Windows 7下以鼠標移動的形式報告,有時需要過濾出來。[B]是連接屏幕協調或應用程序協調的下行鏈路。可能不會,但也許應用程序協作的共同變化會產生影響? – n4m16

回答

2

Windows有時會合成一個假的WM_MOUSEMOVE消息。這尤其會發生在從一個窗口到另一個窗口的焦點變化上。獲得焦點的窗口也會獲得移動消息。在使用Alt + Tab時看到這種情況是非常有用的,因爲這確實是消息的來源。

這完全是故意的。它確保了由WM_MOUSEMOVE觸發的另一列消息將會發生。特別是WM_NCHITTEST和WM_SETCURSOR。以便顯示正確的鼠標光標形狀。否則會受到Control.Cursor和Application.UseWaitCursor屬性在Winforms中的影響。

你必須忍受這一點,確保這絕不是問題。

+1

」否則受到Control.Cursor和Application.UseWaitCursor屬性影響的Winforms。「 這對我來說並不合適。你在這裏給我們一個解決方案嗎? – Prof