2011-10-27 167 views
2

我用win api創建了一個小窗口。這個窗口是另一個線程窗口的子窗口。Win32 Api WM_MOUSEMOVE快速移動鼠標

我想允許用戶通過移動鼠標與預設的右鍵來移動我的窗口。當我以正常速度移動鼠標時,我的窗口移動時沒有問題。但是當我快速移動窗口收到的一些非常奇怪的消息。例如,

P WM_MOUSEMOVE fwKeys:MK_BUTTON XPOS:-32703 yPos:9

正如你所看到的XPOS下降到一個-32000。在我快速移動鼠標後,它幾乎立即發生。我不知道Windows如何向我發送這樣的消息。

爲什麼這條消息可能被髮送並且如何解決?

我正在使用SetCaption函數,因此即使鼠標停留在外面,我的窗口也會提示消息。

Upd。解決了。問題出在我內在的數學上。從lParam得到hi和lowword是不合適的。

+2

'xPos'是16位的值,當從'lParam'解碼'xPos'時,你的數學可能會出現溢出。 –

+0

但是我在Spy ++中看到的那條消息。 – HelloWorld

+0

所以你可能做了一些特殊的事情讓窗口移動右鍵?它可能會導致發送錯誤的消息。 –

回答

0

我在實現拖動支持時遇到了同樣的問題,在按住左鍵的同時用鼠標在屏幕中間快速創建小圓圈,生成一些超出範圍的位置(例如-32000或-64000,儘管正確處理lParam座標轉換)。這看起來像是一個bug,所以我通過將xy剪輯爲當前屏幕大小(以像素爲最大值)並允許負值降至負屏幕大小框來解決此問題。

這是爲了更好地理解代碼提取物(寫在Red/System):

WM_MOUSEMOVE [ 
    lParam: msg/lParam 
    x: GET_X_LPARAM(lParam) 
    y: GET_Y_LPARAM(lParam) 
    if any [ 
     x < (0 - screen-size-x) 
     y < (0 - screen-size-y) 
     x > screen-size-x 
     y > screen-size-y 
    ][ 
     return 0  ;-- ignore this event 
    ] 
    ... 
] 

這解決了這個問題對我來說。

相關問題