我的代码怎么了?带有QT的原始输入API

What is wrong with my code? Raw Input API with Qt

本文关键字:原始 输入 API QT 带有 代码 怎么了 我的      更新时间:2023-10-16

我正在尝试使用QT的原始输入API,以便我可以记录键盘事件和鼠标事件。但是,此代码没有成功。我也是原始输入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,因此您没有给原始输入API一个特定的HWNDWM_INPUT消息发送到。根据文档:

hwndTarget

类型:hwnd

目标窗口的手柄。如果NULL,则遵循键盘焦点。

您的QT窗口是否会获得键盘焦点?如果没有,您将不会接收任何WM_INPUT消息。

通常最好为hwndTarget提供特定的HWND,例如:

rid[index].hwndTarget = reinterpret_cast<HWND>(mainw.WinId());

如果您需要在HWND没有键盘焦点时接收消息,请使用RIDEV_INPUTSINK标志:

rid[index].dwFlags = ... | RIDEV_INPUTSINK;