原始输入鼠标 lastx,通过 RDP 登录时具有奇数值的持久性
Raw Input mouse lastx, lasty with odd values while logged in through RDP
当我尝试通过 RDP 登录时从 lLastX
和 RAWMOUSE
结构的 lLastY
成员更新我的鼠标位置时,我得到了一些非常奇怪的信息数字(例如两者都> 30,000)。我在 Windows 7、8、8.1 和 10 上注意到了这种行为。
usFlags 成员 returns 的值为 MOUSE_MOVE_ABSOLUTE | MOUSE_VIRTUAL_DESKTOP
。关于 MOUSE_MOVE_ABSOLUTE
,我在代码中处理绝对定位和相对定位。但是,虚拟桌面标志让我有点困惑,因为我认为该标志用于多显示器设置。我有一种感觉,那面旗帜和我得到的奇怪数字有联系。不幸的是,我真的不知道如何在没有参考点的情况下调整值,我什至不知道如何获得参考点。
当我在本地 运行 我的代码时,一切正常。
所以有人知道为什么 RDP + 原始输入会给我如此混乱的鼠标 lastx/lasty 值吗?如果是这样,有没有办法将它们转换为更合理的值?
似乎在通过远程桌面使用 WM_INPUT
时,设置了 MOUSE_MOVE_ABSOLUTE
和 MOUSE_VIRTUAL_DESKTOP
位,值似乎在 0
到 USHRT_MAX
.
我从来没有真正找到明确的文档说明设置 MOUSE_VIRTUAL_DESKTOP
位时使用的坐标系,但到目前为止这似乎工作得很好:
case WM_INPUT: {
UINT buffer_size = 48;
LPBYTE buffer[48];
GetRawInputData((HRAWINPUT)lparam, RID_INPUT, buffer, &buffer_size, sizeof(RAWINPUTHEADER));
RAWINPUT* raw = (RAWINPUT*)buffer;
if (raw->header.dwType != RIM_TYPEMOUSE) {
break;
}
const RAWMOUSE& mouse = raw->data.mouse;
if ((mouse.usFlags & MOUSE_MOVE_ABSOLUTE) == MOUSE_MOVE_ABSOLUTE) {
static Vector3 last_pos = vector3(FLT_MAX, FLT_MAX, FLT_MAX);
const bool virtual_desktop = (mouse.usFlags & MOUSE_VIRTUAL_DESKTOP) == MOUSE_VIRTUAL_DESKTOP;
const int width = GetSystemMetrics(virtual_desktop ? SM_CXVIRTUALSCREEN : SM_CXSCREEN);
const int height = GetSystemMetrics(virtual_desktop ? SM_CYVIRTUALSCREEN : SM_CYSCREEN);
const Vector3 absolute_pos = vector3((mouse.lLastX / float(USHRT_MAX)) * width, (mouse.lLastY / float(USHRT_MAX)) * height, 0);
if (last_pos != vector3(FLT_MAX, FLT_MAX, FLT_MAX)) {
MouseMoveEvent(absolute_pos - last_pos);
}
last_pos = absolute_pos;
}
else {
MouseMoveEvent(vector3((float)mouse.lLastX, (float)mouse.lLastY, 0));
}
}
break;
当我尝试通过 RDP 登录时从 lLastX
和 RAWMOUSE
结构的 lLastY
成员更新我的鼠标位置时,我得到了一些非常奇怪的信息数字(例如两者都> 30,000)。我在 Windows 7、8、8.1 和 10 上注意到了这种行为。
usFlags 成员 returns 的值为 MOUSE_MOVE_ABSOLUTE | MOUSE_VIRTUAL_DESKTOP
。关于 MOUSE_MOVE_ABSOLUTE
,我在代码中处理绝对定位和相对定位。但是,虚拟桌面标志让我有点困惑,因为我认为该标志用于多显示器设置。我有一种感觉,那面旗帜和我得到的奇怪数字有联系。不幸的是,我真的不知道如何在没有参考点的情况下调整值,我什至不知道如何获得参考点。
当我在本地 运行 我的代码时,一切正常。
所以有人知道为什么 RDP + 原始输入会给我如此混乱的鼠标 lastx/lasty 值吗?如果是这样,有没有办法将它们转换为更合理的值?
似乎在通过远程桌面使用 WM_INPUT
时,设置了 MOUSE_MOVE_ABSOLUTE
和 MOUSE_VIRTUAL_DESKTOP
位,值似乎在 0
到 USHRT_MAX
.
我从来没有真正找到明确的文档说明设置 MOUSE_VIRTUAL_DESKTOP
位时使用的坐标系,但到目前为止这似乎工作得很好:
case WM_INPUT: {
UINT buffer_size = 48;
LPBYTE buffer[48];
GetRawInputData((HRAWINPUT)lparam, RID_INPUT, buffer, &buffer_size, sizeof(RAWINPUTHEADER));
RAWINPUT* raw = (RAWINPUT*)buffer;
if (raw->header.dwType != RIM_TYPEMOUSE) {
break;
}
const RAWMOUSE& mouse = raw->data.mouse;
if ((mouse.usFlags & MOUSE_MOVE_ABSOLUTE) == MOUSE_MOVE_ABSOLUTE) {
static Vector3 last_pos = vector3(FLT_MAX, FLT_MAX, FLT_MAX);
const bool virtual_desktop = (mouse.usFlags & MOUSE_VIRTUAL_DESKTOP) == MOUSE_VIRTUAL_DESKTOP;
const int width = GetSystemMetrics(virtual_desktop ? SM_CXVIRTUALSCREEN : SM_CXSCREEN);
const int height = GetSystemMetrics(virtual_desktop ? SM_CYVIRTUALSCREEN : SM_CYSCREEN);
const Vector3 absolute_pos = vector3((mouse.lLastX / float(USHRT_MAX)) * width, (mouse.lLastY / float(USHRT_MAX)) * height, 0);
if (last_pos != vector3(FLT_MAX, FLT_MAX, FLT_MAX)) {
MouseMoveEvent(absolute_pos - last_pos);
}
last_pos = absolute_pos;
}
else {
MouseMoveEvent(vector3((float)mouse.lLastX, (float)mouse.lLastY, 0));
}
}
break;