原始输入设备RAWMOUSE用法

时间:2013-01-01 18:59:44

标签: c++ c winapi mingw

我正在使用winapi的原始输入设备进行鼠标输入,似乎我在RAWMOUSE结构中没有得到正确的值。

当我得到RAWMOUSE结构时,我得到了 lLastX lLastY 的值,但是出于某种原因, ulRawButtons 是msdn文档说ulRawButtons是“鼠标按钮的原始状态”所以我认为这应该在我按下鼠标按钮时改变。

这是我创建原始输入设备的代码(为了便于阅读,我删除了错误检查):

RAWINPUTDEVICE rid;
rid.usUsagePage = 0x01;
rid.usUsage     = 0x02;
rid.dwFlags     = RIDEV_INPUTSINK;
rid.hwndTarget  = myWindowHandle;
RegisterRawInputDevices(&rid, 1, sizeof(rid));

WM_INPUT 消息后,我致电:

void handleRawInput(HWND window, UINT, WPARAM wParam, LPARAM lParam)
{
    RAWINPUT input;
    UINT szData = sizeof(input), szHeader = sizeof(RAWINPUTHEADER);
    HRAWINPUT handle = reinterpret_cast<HRAWINPUT>(lParam);

    GetRawInputData(handle, RID_INPUT, &input, &szData, szHeader);
    if (input.header.dwType == RIM_TYPEMOUSE)
    {
        // Here input.data.mouse.ulRawButtons is 0 at all times.
    }
}

我正在使用mingw32(4.7)并且我已经定义了 WIN32_LEAN_AND_MEAN WINVER = 0x0501 WIN32_WINNT = 0x0501

为什么我没有获得ulRawButtons的正确值?

1 个答案:

答案 0 :(得分:2)

Windows使用鼠标驱动程序通过RAWMOUSE结构体来填充MOUSE_INPUT_DATA结构。

您会注意到MOUSE_INPUT_DATA的{​​{3}}声明如下:

  

<强> RawButtons

     
    

指定鼠标按钮的原始状态。 Win32子系统不使用此成员。

  

MSDN页面没有说的是,Win32不仅不使用RawButtons / ulRawButtons,而且它所附带的鼠标驱动程序也不会填充它们。因此,除非您有来自第三方供应商的鼠标驱动程序,否则您永远不会设置此字段。

我认为您要使用的是:input.data.mouse.usButtonFlags用于鼠标点击,input.data.mouse.usButtonData用于滚轮增量。