我正在尝试使用带有Qt的Raw Input API,以便我可以记录键盘事件和鼠标事件。但是,此代码不成功。我也是Raw Input API的初学者。
我尝试使用调试器,发现WM_INPUT没有执行。 Qt有问题吗?
而且我的MainWin也冻结了。
main.cpp中
#include <QApplication>
#include "MainWin.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWin mainw;
mainw.show();
RAWINPUTDEVICE rid[2];
rid[0].usUsagePage = 0x01;
rid[0].usUsage = 0x02;
rid[0].dwFlags = RIDEV_NOLEGACY;
rid[0].hwndTarget = 0;
rid[1].usUsagePage = 0x01;
rid[1].usUsage = 0x06;
rid[1].dwFlags = RIDEV_NOLEGACY;
rid[1].hwndTarget = 0;
if (RegisterRawInputDevices(rid, 2, sizeof(RAWINPUTDEVICE)) == false)
exit(-1);
return a.exec();
}
MainWin.cpp
#include "MainWin.h"
MainWin::MainWin()
{
}
MainWin::~MainWin()
{
}
bool MainWin::nativeEventF(const QByteArray & eventType, void * message, long * result)
{
MSG * msg = (MSG*)message;
switch (msg->message)
{
case WM_INPUT:
qDebug() << "in";
break;
}
return false;
}
我的实施中有什么问题吗?
您正在将RAWINPUTDEVICE::hwndTarget
字段设置为0,因此您不会向Raw Input API提供特定的HWND
来发送WM_INPUT
消息。根据documentation:
hwndTarget
类型:HWND
目标窗口的句柄。如果
NULL
它跟随键盘焦点。
你的Qt窗口是否会获得键盘焦点?如果没有,您将不会收到任何WM_INPUT
消息。
通常最好为HWND
提供特定的hwndTarget
,例如:
rid[index].hwndTarget = reinterpret_cast<HWND>(mainw.WinId());
如果您需要在HWND
没有键盘焦点时收到消息,请使用RIDEV_INPUTSINK
标志:
rid[index].dwFlags = ... | RIDEV_INPUTSINK;