Что не так с моим кодом?API необработанного ввода с Qt - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь использовать Raw Input API с Qt, чтобы я мог записывать события клавиатуры и мыши.Однако этот код был неудачным.Я также новичок в 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;
}

Что-то не так в моей реализации?

1 Ответ

0 голосов
/ 15 февраля 2019

Вы устанавливаете для поля RAWINPUTDEVICE::hwndTarget значение 0, поэтому вы не предоставляете API необработанного ввода конкретный HWND для отправки WM_INPUT сообщений.Согласно документации :

hwndTarget

Тип: HWND

Дескриптор целевого окна. Если NULL, то он следует за фокусом клавиатуры.

Получает ли ваше окно Qt фокус клавиатуры?Если нет, вы не будете получать WM_INPUT сообщений.

Обычно лучше указать конкретный HWND для hwndTarget, например:

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

Есливам нужно получать сообщения, пока у HWND нет фокуса клавиатуры, затем используйте флаг RIDEV_INPUTSINK:

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