【问题标题】:Interpretation of raw mouse input原始鼠标输入的解释
【发布时间】:2013-07-05 20:53:53
【问题描述】:

我最近开始阅读《Beginning DirectX 11 Programming》(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;
        }
     }

【问题讨论】:

  • Win32 的领域比您想象的要广泛得多。也许你的意思是它教你窗口消息。
  • 这是一个非常广泛和通用的问题。严格来说,是通过调用相关的API函数来使用的。
  • 每次收到鼠标输入时都会发生内存泄漏。那不是你想要的。使用向量。

标签: c++ directx


【解决方案1】:

你可以这样做:

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;
}

Mouse movement with WM_INPUT中所述(文章也适用于非高清)。该文章还包含一个 WM_MOUSEMOVE 示例。

【讨论】:

  • Floris Velleman,这里需要注意的是,“dwSize”值并不总是 40! (即对于 64 位应用程序,该值为 48)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多