2011-10-27 127 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 
    ] 
    ... 
] 

这解决了这个问题对我来说。

相关问题