在Qt中获取原始鼠标移动

坦那斯帕

在处理这个QAbstractNativeEventFilter类之后,我终于从HID(鼠标和键盘)获得了本机事件。

我读过许多类似的问题,但都没有解决我的问题。我尝试使鼠标移动基于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您的帮助很大!谢谢!!!

我终于找到了解决方案。

我必须调用RegisterRawInputDevicesmain.cpp并进行很多更改。

这是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 Class的一部分

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果在释放鼠标之前鼠标没有移动,则在Qt 5中获取鼠标放置事件

来自分类Dev

获取鼠标移动速度

来自分类Dev

Qt鼠标移动/动作组合

来自分类Dev

每次鼠标移动时获取鼠标坐标

来自分类Dev

如何在Qt中获取鼠标在屏幕上的位置?

来自分类Dev

Qt中的鼠标事件

来自分类Dev

Qt:鼠标移动过程中更改QGraphicsItem接收器

来自分类Dev

在Qt中的鼠标移动事件上调整矩形的png图像的大小/比例

来自分类Dev

Qt:鼠标移动过程中更改QGraphicsItem接收器

来自分类Dev

无需外部库即可在C ++中获取原始的键盘和鼠标输入

来自分类Dev

在Linux中相对移动鼠标

来自分类Dev

Swift 中的线性鼠标移动

来自分类Dev

获取视频以按鼠标移动的方向播放

来自分类Dev

光标锁定时如何获取鼠标移动?

来自分类Dev

在鼠标移动时获取fabric.js中图像像素的rgb值

来自分类Dev

硒-通过水平移动鼠标从隐藏的工具提示中获取文本

来自分类Dev

如何在Typescript Angular中获取鼠标移动上xy坐标的十进制值?

来自分类Dev

移动设备中鼠标移动时,对象无法正常移动

来自分类Dev

Qt Windows获取鼠标光标图标

来自分类Dev

QT图形场景/视图-用鼠标四处移动

来自分类Dev

鼠标移动,而鼠标向下在Dart中不起作用?

来自分类Dev

javascript中逼真的鼠标移动坐标?

来自分类Dev

在Opengl中通过鼠标移动形状

来自分类Dev

react div中的鼠标元素移动

来自分类Dev

在Java中通过单击鼠标移动球

来自分类Dev

Node.js中的鼠标移动

来自分类Dev

在Opengl中通过鼠标移动形状

来自分类Dev

在svg中获取鼠标位置

来自分类Dev

在Qt的QWebView中模拟鼠标单击?

Related 相关文章

热门标签

归档