【问题标题】:What is wrong with my code? Raw Input API with Qt我的代码有什么问题?使用 Qt 的原始输入 API
【发布时间】:2019-07-09 06:34:39
【问题描述】:

我正在尝试将 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;
}

我的实现有问题吗?

【问题讨论】:

  • 也尝试了 RIDEV_INPUTSINK 但 nothong 工作
  • stackoverflow.com/help/mcve MainWin.h 在哪里?
  • 什么是nativeEventF,除了nativeEvent 的拼写错误?

标签: c++ qt winapi raw-input


【解决方案1】:

您将 RAWINPUTDEVICE::hwndTarget 字段设置为 0,因此您没有为原始输入 API 提供特定的 HWND 以向其发送 WM_INPUT 消息。根据documentation

hwndTarget

类型:HWND

目标窗口的句柄。 如果NULL 跟随键盘焦点。

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    相关资源
    最近更新 更多