【问题标题】:Win32 Api WM_MOUSEMOVE moving mouse quickWin32 Api WM_MOUSEMOVE 快速移动鼠标
【发布时间】:2011-10-27 02:50:19
【问题描述】:

我通过 win api 创建了一个小窗口。此窗口是另一个线程的窗口的子窗口。

我想让用户通过按下右键移动鼠标来移动我的窗口。当我以正常速度移动鼠标时,我的窗口移动没有问题。但是当我快速移动时,窗口收到了一些非常奇怪的消息。例如,

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

如您所见,xPos 下降到 -32000。它几乎在我快速移动鼠标后立即发生。我不知道windows如何向我发送这样的消息。

为什么可以发送该消息以及如何修复它?

我正在使用 SetCaption 函数,因此即使鼠标停留在外面,我的窗口也会收到消息。

更新。解决了。问题出在我固有的数学上。从 lParam 获取 hi 和 lowword 是不合适的。

【问题讨论】:

  • xPos 是 16 位值,您可能在从 lParam 解码 xPos 时出现数学溢出。
  • 但是我在 Spy++ 中看到的那条消息。
  • 所以你可能正在做一些特别的事情来用右键移动窗口?这可能会导致发送错误消息。

标签: winapi mousemove


【解决方案1】:

我在实现拖动支持时遇到了同样的问题,在按下左键时用鼠标在屏幕中间快速制作小圆圈,生成一些超出范围的位置(如 -32000 或 -64000,尽管处理得当lParam 坐标转换)。这对我来说似乎是一个错误,所以我通过将 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
    ]
    ...
]

这为我解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多