【问题标题】:RawInput mouse - cannot move window or use controlsRawInput 鼠标 - 无法移动窗口或使用控件
【发布时间】:2014-03-17 13:09:26
【问题描述】:

我目前正在使用 Windows 的 RawInput API 来访问键盘和鼠标输入。 我有点困惑的一件事是,当我将鼠标注册为RawInputDevice 时,我无法移动我的 Win32 窗口或使用那里的控件(关闭、最小化等...)。相反,我得到一个加载图标光标。这是正常行为吗? 这就是我注册设备的方式:

    RAWINPUTDEVICE Rid[2];

    Rid[0].usUsagePage = 0x01;
    Rid[0].usUsage = 0x02;
    Rid[0].dwFlags = RIDEV_NOLEGACY;   // adds HID mouse and also ignores legacy mouse messages
    Rid[0].hwndTarget = windowHandle;

    Rid[1].usUsagePage = 0x01;
    Rid[1].usUsage = 0x06;
    Rid[1].dwFlags = RIDEV_NOLEGACY;   // adds HID keyboard and also ignores legacy keyboard messages
    Rid[1].hwndTarget = windowHandle;

    if (RegisterRawInputDevices(Rid, 2, sizeof(Rid[0])) == FALSE) {
         // smth went wrong.
    }

这就是我处理WM_INPUT 案件的方式:

case WM_INPUT:
    char buffer[sizeof(RAWINPUT)] = {};
    UINT size = sizeof(RAWINPUT);
    GetRawInputData(reinterpret_cast<HRAWINPUT>(lParam), RID_INPUT, buffer, &size, sizeof(RAWINPUTHEADER));
    RAWINPUT* raw = reinterpret_cast<RAWINPUT*>(buffer);
    if (raw->header.dwType == RIM_TYPEMOUSE || raw->header.dwType == RIM_TYPEKEYBOARD) {
        inputManager.processMessage(*raw);
    }
    break;

有什么问题吗?

【问题讨论】:

  • 是的,因为它没有按您的预期工作。到目前为止你做了什么?

标签: c++ winapi raw-input


【解决方案1】:

您正在设置RIDEV_NOLEGACY 标志。这会禁用旧鼠标消息。

因此默认窗口过程不接收鼠标消息。所以它不能移动你的窗口,或者响应按钮点击,或者其他什么。你看到的是什么。

【讨论】:

  • 天哪。非常感谢!
猜你喜欢
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
相关资源
最近更新 更多