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

时间:2019-05-28 22:20:44

标签: windows winapi c++14 directx mouseevent

我正在使用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;
        }

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

我发现在WinAPI中最接近的答案是GetCursorPos()GetWindowRect()组合,但是如果窗口具有标题栏,则它的相对偏移不计算在内,并且(0,0)坐标设置为标题栏顶部,但不在客户区域上。

如何解决此问题而又不会使鼠标相对移动?

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

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

其他信息

1 个答案:

答案 0 :(得分:2)

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

WM_INPUT在大多数情况下仅提供相关信息,并且如果您尝试自己模拟绝对值,则将丢失很多指针弹道,使它感觉真的很差。

  

请注意,如果您希望您的游戏支持通过远程桌面使用(通常用于测试),则需要处理来自绝对位置的相对输入,因为在虚拟桌面的情况下,您永远不会获得相对的输入,只有绝对的,来自WM_INPUT。由MOUSE_VIRTUAL_DESKTOP表示。

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