来自原始输入法的鼠标位置

时间:2012-01-10 12:55:25

标签: mouse mouseevent raw-input

我正在尝试使用Raw输入法获取鼠标位置。在RAWMOUSE结构中,我总是将值MOUSE_MOVE_RELATIVE作为usFlags获取,这意味着我获得了最后一个鼠标位置的相对值。但我想要鼠标的绝对位置。如何从Raw输入中获取鼠标的绝对位置值?

2 个答案:

答案 0 :(得分:1)

RAWMOUSE 具有与 Windows 从鼠标硬件(可能是 HID USB/蓝牙或 i8042 PS/2 鼠标等)接收到的完全相同的值。通常鼠标发送相对运动,但有些可以发送绝对运动 - 例如触摸屏、RDP 鼠标(是的!)。

因此,如果您需要绝对鼠标位置(例如游戏菜单),您可以使用 GetCursorPos API 来获取屏幕上 Windows 渲染光标的坐标。

但它与在 MOUSE_MOVE_ABSOLUTE 中使用 RAWMOUSE 标志发送的不同。

MOUSE_MOVE_ABSOLUTE 是设备空间中 0..65535 范围内的鼠标移动,而不是屏幕空间。这是一些如何将其转换为屏幕空间的代码:

if ((rawMouse.usFlags & MOUSE_MOVE_ABSOLUTE) == MOUSE_MOVE_ABSOLUTE)
{
    bool isVirtualDesktop = (rawMouse.usFlags & MOUSE_VIRTUAL_DESKTOP) == MOUSE_VIRTUAL_DESKTOP;

    int width = GetSystemMetrics(isVirtualDesktop ? SM_CXVIRTUALSCREEN : SM_CXSCREEN);
    int height = GetSystemMetrics(isVirtualDesktop ? SM_CYVIRTUALSCREEN : SM_CYSCREEN);

    int absoluteX = int((rawMouse.lLastX / 65535.0f) * width);
    int absoluteY = int((rawMouse.lLastY / 65535.0f) * height);
}
else if (rawMouse.lLastX != 0 || rawMouse.lLastY != 0)
{
    int relativeX = rawMouse.lLastX;
    int relativeY = rawMouse.lLastY;
}

答案 1 :(得分:0)

[奇怪地看到一个 9 年前未回答的问题作为顶级谷歌搜索结果,所以我会提供答案..迟到总比不到好!]

在原始输入 API 级别,您将获得鼠标设备的原始水平/垂直移动——鼠标在硬件级别报告的内容。

根据文档(我尚未验证),桌面鼠标速度/加速度/减速设置尚未处理这些增量 X/Y 值。因此,即使您从已知的绝对位置开始跟踪增量,您也会很快偏离 Windows 在屏幕上定位鼠标光标的位置。

文档中不清楚的是,报告这些相对 X/Y 值的单位或比例是什么。如果以某种方式标准化就好了,但我怀疑这取决于鼠标的 DPI 分辨率。 (我会找一个 DPI 可调的鼠标来测试,如果没有人先编辑我,然后报告。)

编辑/更新:我拿到了一个 DPI 可调的鼠标……做了一些粗略的测试,足以确认 lLastX/Y 值的粗略比例似乎与硬件 DPI 匹配……例如。鼠标在 1200 dpi 模式下,从左向右移动 1 英寸,生成 lLastX 值的净总和 ~= 1200。

相关问题