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

Ily*_*tov 0 windows directx winapi mouseevent c++14

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

问题是,我的引擎是针对射击/砍杀游戏的,因此它需要直接输入,这是在之前的项目中使用 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;
        }
Run Code Online (Sandbox Code Playgroud)

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

我在 WinAPI 中找到的最接近答案是GetCursorPos()与 结合使用GetWindowRect(),但是如果窗口有标题栏相对偏移量,则它不算在内,并且 (0,0) 坐标设置在标题栏的顶部,但不在客户端区域上。

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

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

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

附加信息

Chu*_*urn 5

当您需要绝对鼠标位置时,最好的选择是使用标准WM_MOUSE*消息,并且仅用于WM_INPUT相对鼠标位置。通常,在调出 UI 或其他一些方面以进入/退出相对“外观”模式时,您会进行模式转换。

WM_INPUT在大多数情况下仅提供相对信息,如果您尝试模仿绝对的自己,您将错过很多指针弹道,这会让您感觉非常糟糕。

请注意,如果您希望游戏支持通过远程桌面使用(通常用于测试),那么您需要处理从绝对位置模拟相对输入,因为在虚拟桌面的情况下,您永远不会从WM_INPUT. 这由 表示MOUSE_VIRTUAL_DESKTOP

您可能想看看DirectX Tool Kit中的Mouse类实现。