如何通过 WM_INPUT 设置获得绝对鼠标位置?

How to get absolute mouse position with WM_INPUT set up?

我正在研究 Direct3D 游戏引擎,我的鼠标和键盘设置来自我之前的项目,但最近 运行 遇到了问题:

问题是,我的引擎是针对 shooter/slasher 游戏的,所以它需要直接输入,这是在之前的项目中使用 RAWMOUSE 和 WM_INPUT 消息解析设置的。

    case WM_INPUT:
        if (wParam == RIM_INPUT)
        {
            dword dwSize = 48;
            RAWINPUT raw;

            if (GetRawInputData((HRAWINPUT)lParam, RID_INPUT, &raw, &dwSize,
                sizeof(RAWINPUTHEADER)) != dwSize)
                OutputDebugString(TEXT("GetRawInputData does not return correct size !\n"));

            if (raw.header.dwType == RIM_TYPEMOUSE)
            {
                this->mouse.TranslateMouseInput(raw.data.mouse);
            }
            break;
        }

问题是,代码 returns 只是鼠标的相对移动,它在设置相机查找时很有用,但是当涉及到菜单或基本 GUI 时,它们由鼠标(按钮等)控制。 .) 事情变坏了:GUI 和其他控件需要计算相对于客户端矩形的光标位置。

我发现在 WinAPI 中最接近回答的是 GetCursorPos()GetWindowRect() 的结合,但是如果 window 有一个标题栏,它的相对偏移量不算数并且 (0,0 ) 坐标设置在标题栏的顶部,但不在客户区。

如何在不丢失相对鼠标移动的情况下解决问题?

-我应该尝试用 WM_INPUT 解析 WM_MOUSEMOVE 消息吗?

我一直在寻找一种流行的游戏引擎输入解决方案,但没有找到任何特定的解决方案。

附加信息:

当您需要绝对鼠标位置时,您最好的选择是使用标准 WM_MOUSE* 消息,并且只使用 WM_INPUT 作为相对鼠标位置。通常,在启动 UI 或其他方面以获得相对 'look' 模式的 in/out 时,您会进行模式转换。

WM_INPUT 在大多数情况下仅提供相对信息,如果您尝试自己模拟绝对信息,您将错过很多指针弹道,这让人感觉很不对劲。

Note that if you want your game to support use via remote desktop (typically for testing), then you need to deal with emulating relative input from absolute position because in the case of a virtual desktop you never get relative, only absolute, from WM_INPUT. This is indicated by MOUSE_VIRTUAL_DESKTOP.

您可能想看看 Mouse class implementation in DirectX Tool Kit