原始输入鼠标 lastx,通过 RDP 登录时具有奇数值的持久性

Raw Input mouse lastx, lasty with odd values while logged in through RDP

当我尝试通过 RDP 登录时从 lLastXRAWMOUSE 结构的 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_ABSOLUTEMOUSE_VIRTUAL_DESKTOP 位,值似乎在 0USHRT_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;