c++ - 在 Qt 中获取原始鼠标移动

标签 c++ qt winapi mouseevent raw-input

在处理 this 之后和 QAbstractNativeEventFilter我终于从 HID(鼠标和键盘)获得了 native 事件。

我读过很多类似的问题,但没有一个能解决我的问题。我尝试根据 dpi 移动鼠标。我在 Qt 5.5 上工作,因为我的整个项目都是在那里构建的。

即使使用 RIM_TYPEMOUSE 标志,我也无法将鼠标移动事件与其他 HID 事件(鼠标和键盘)分开。

这是我的实现的一些代码:

bool MouseRawMovement::nativeEventFilter(const QByteArray &eventType, void *message, long *result)
{   
    if(eventType == "windows_generic_MSG")
    {
        MSG *msg = reinterpret_cast<MSG*>(message);
        qDebug()<<msg->message; // It prints numbers such as 6,26,28,141 on each event
        if(msg->message == WM_INPUT) //it never gets in
        {
        UINT dwSize = 40;
        static BYTE lpb[40];
        GetRawInputData((HRAWINPUT)msg->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;

            qDebug()<<xPosRelative<<yPosRelative ;
        }
        }
    }
    return false;
}

这也是我的构造函数

    MouseRawMovement::MouseRawMovement()
    {
       Rid[0].usUsagePage = 0x01;
       Rid[0].usUsage = 0x02;
       Rid[0].dwFlags = RIDEV_INPUTSINK;
       Rid[0].hwndTarget = 0;
       if(!RegisterRawInputDevices(Rid, 1, sizeof(Rid[0])))
           qDebug()<<QString::number(GetLastError()); //I see error msg 6 - Ref. ERROR_INVALID_HANDLE
    }

输出始终显示零 (0)。

hWnd 发生了什么。我试着给这个:

HWND hWnd =::GetConsoleWindow();

但我得到了相同的结果。

在 main.cpp 中我安装了原生过滤器

MainWindow w;
a.installNativeEventFilter(&w.mm);

我试了好几天都找不到解决办法。有没有人...(???)

最佳答案

@nnatarr 你的帮助是巨大的!谢谢!!!

我终于找到了解决办法。

我必须在 main.cpp 中调用 RegisterRawInputDevices 并更改很多东西。

这是main.cpp

#include "mainwindow.h"
#include <QApplication>
#include <windows.h>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    a.installNativeEventFilter(&w.mm);
    w.show();

    UINT nDevices;
   PRAWINPUTDEVICELIST pRawInputDeviceList;

   if (!GetRawInputDeviceList(NULL, &nDevices, sizeof(RAWINPUTDEVICELIST)))
   {
      qDebug() << "ERROR -- GetRawInputDeviceList ...";
      return 1;
   }

   if (!(pRawInputDeviceList = (PRAWINPUTDEVICELIST)malloc(sizeof(RAWINPUTDEVICELIST) * nDevices)))
   {
      qDebug() << "Initialization failed...";
      return 1;
   }

    RAWINPUTDEVICE Rid[1];
    Rid[0].usUsagePage = HID_USAGE_PAGE_GENERIC;
    Rid[0].usUsage = HID_USAGE_GENERIC_MOUSE;
    Rid[0].dwFlags = RIDEV_INPUTSINK;
    Rid[0].hwndTarget = (HWND)w.effectiveWinId();
    if(!RegisterRawInputDevices(Rid, 1, sizeof(Rid[0])))
        qDebug()<<"Huston Problem.";
    qDebug()<<QString::number(GetLastError());

    return a.exec();
}

这是 Mouse Handlig 类的一部分

bool MouseRawMovement::nativeEventFilter(const QByteArray &eventType, void *message, long *result)
{
    if(eventType == "windows_generic_MSG")
    {
        MSG *msg = reinterpret_cast<MSG*>(message);

        if(msg->message == WM_INPUT)
        {
            UINT dwSize = 40;
            static BYTE lpb[40];
            if(!GetRawInputData((HRAWINPUT)msg->lParam, RID_INPUT,lpb, &dwSize, sizeof(RAWINPUTHEADER)))
                qDebug()<<"Error GetRawInputData";
            else
            {
                RAWINPUT* raw = (RAWINPUT*)lpb;
                if (raw->header.dwType == RIM_TYPEMOUSE)
                {
                    int xPosRelative = raw->data.mouse.lLastX;
                    int yPosRelative = raw->data.mouse.lLastY;
                    //qDebug()<<xPosRelative<<yPosRelative;
                }
            }

        }
    }
    return false;
}

关于c++ - 在 Qt 中获取原始鼠标移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37071142/

相关文章:

c++ - QPixmap fromImage 导致分割错误

c++ - 在一个应用程序中创建两个窗口?

windows - UDP 数据包,被 Wireshark 看到,被(甚至没有到达)WSARecvFrom 丢弃

c++ - Qt - 在 QSignalMapper 调用的函数中更新

c++ - 转换自 1601 年以来 100 ns 的数量以 boost C++ 中的 posix 时间

Qt 套件选择

c++ - 将 win32 代码 (windows.h) 移植到 linux

c++ - OpenGL 着色器程序无法验证但未给出错误消息

c++ - 花哨的指针是什么样子的?

c++ - QtQuick : Change expand icon in TreeView