【发布时间】:2016-05-06 11:22:54
【问题描述】:
在处理 this 和 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);
我尝试了几天,但找不到解决方案。有没有人...(???)
【问题讨论】:
-
但是你的问题是什么? “不能分开”是什么意思?
-
要么我有 RIM_TYPEMOUSE 检查要么不一样。当我按下鼠标或键盘键时,我有输出......其次,我只看到零。
标签: c++ qt winapi mouseevent raw-input