我的代码出了什么问题?带Qt的原始输入API

问题描述 投票:-1回答:1

我正在尝试使用带有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;
}

我的实施中有什么问题吗?

c++ qt winapi raw-input
1个回答
0
投票

您正在将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;
© www.soinside.com 2019 - 2024. All rights reserved.