原始鼠标输入的解释

Interpretation of raw mouse input

本文关键字:解释 输入 鼠标 原始      更新时间:2023-10-16

我最近开始阅读《开始DirectX 11编程》(Allen Sherrod,Wendy Jones),偶然发现了一个关于输入的问题。这本书只教我如何使用Win32、DirectInput和XInput进行输入处理。然而,经过一点研究,我意识到我应该使用RawInput进行输入处理。这就是问题产生的地方。

我已经设法使我的应用程序能够接收原始鼠标输入。我想问你们的问题是:我如何解释原始鼠标数据并在游戏中使用它,类似于你们如何使用WM_MOUSEMOVE?

编辑:很抱歉我把自己表述得很糟糕。我想知道鼠标指针在应用程序屏幕中的位置,但不了解鼠标原始输入的值。(mX,mY)

    case WM_INPUT:
    {
        UINT bufferSize;
        GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &bufferSize, sizeof(RAWINPUTHEADER));
        BYTE *buffer = new BYTE[bufferSize];
        GetRawInputData((HRAWINPUT)lParam, RID_INPUT, (LPVOID)buffer, &bufferSize, sizeof(RAWINPUTHEADER));
        RAWINPUT *raw = (RAWINPUT*) buffer;
        if ( raw->header.dwType == RIM_TYPEMOUSE)
        {
            long mX = raw->data.mouse.lLastX;
            long mY = raw->data.mouse.lLastY;
        }
     }

你可以通过这样做来实现这一点:

case WM_INPUT: 
{
    UINT dwSize = 40;
    static BYTE lpb[40];
    GetRawInputData((HRAWINPUT)lParam, RID_INPUT, 
                    lpb, &dwSize, sizeof(RAWINPUTHEADER));
    RAWINPUT* raw = (RAWINPUT*)lpb;
    if (raw->header.dwType == RIM_TYPEMOUSE) 
    {
        int xPosRelative = raw->data.mouse.lLastX;
        int yPosRelative = raw->data.mouse.lLastY;
    } 
    break;
}

正如WM_INPUT的鼠标移动中所提到的(文章也适用于非高清)。本文还包含一个WM_MOUSEMOVE的示例。