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