【问题标题】:Raw Input Device RAWMOUSE Usage原始输入设备 RAWMOUSE 用法
【发布时间】:2012-12-16 07:17:33
【问题描述】:

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

当我得到 RAWMOUSE 结构时,我得到了 lLastXlLastY 的值,但由于某种原因 ulRawButtons 是始终为 0。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_MEANWINVER=0x0501WIN32_WINNT=0x0501

知道为什么我没有得到正确的 ulRawButtons 值吗?

【问题讨论】:

  • 该值直接来自设备驱动程序。也许你有一个古怪的,它使用 usButtonFlags 依赖于 Windows。
  • Microsoft MSDN 网站上msdn.microsoft.com/en-us/library/ms645546(v=vs.85).aspx 上关于“使用原始输入”主题的演示代码提供了键盘和鼠标的示例,正​​如@Sean Cline 在他的回答中提到的那样,我对此的使用Win32 窗口应用程序中的演示代码显示 data.mouse.ulButtonsdata.mouse.usButtonFlags 在我单击笔记本电脑上的鼠标垫按钮时都会更改值,但 data.mouse.ulRawButtons 似乎总是为零。

标签: c++ c winapi mingw


【解决方案1】:

Windows 使用鼠标驱动程序通过 MOUSE_INPUT_DATA 结构告诉它的内容填充 RAWMOUSE 结构。

您会注意到MOUSE_INPUT_DATAMSDN page 声明如下:

原始按钮

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

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

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

【讨论】:

  • 感谢您的回答,我的印象是 usButtonFlags 显示了差异,而 ulRawButtons 显示了当前状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多