ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Windows -- Qt 利用RAWINPUT来获取外设输入

2021-12-13 12:04:13  阅读:221  来源: 互联网

标签:return Qt dwSize raw Windows hwnd -- rid lpb


使用RAWINPUT可以查看外设事件的具体信息,具体方法如下:
1.在 构造 函数里添加一下代码:

HWND m_hwnd = this->winId;
RegisitWindow(HWND hwnd);

2.注册RawInput设备
主要是用函数 RegisterRawInputDevice
使用方法如下:

bool Dialog::RegisitWindow(HWND hwnd)
{
    if ( nullptr == hwnd ){
        return FALSE;
    }
    RAWINPUTDEVICE rid;  //设备信息
    rid.usUsagePage = 0x0d;
    rid.usUsage = 0x05; // 0X05 触摸板    06键盘   rid.usUsagePage = 0x01; rid.usUsage = 0x02; 为鼠标
    rid.dwFlags = RIDEV_INPUTSINK;
    rid.hwndTarget = hwnd;
    if ( !RegisterRawInputDevices( &rid, 1, sizeof(RAWINPUTDEVICE) )){
        return FALSE;
    }
    return TRUE;
}

将窗口句柄和RawInput注册在一起,如果不指定窗口和Flag则只有焦点在窗体时有效;
参考windows官方文档:
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-registerrawinputdevices
https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-rawinputdevice
3.重写 nativeEvent 函数
重写nativeEvent可以获取windows的消息循环,注册成功后,消息循环接受 IN_PUT,我们从中获取相关数据

bool Dialog::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
    MSG* msg = (MSG*)message;
    LPBYTE lpb;
    RAWINPUT* raw;
    UINT dwSize;
    if(msg->message == WM_INPUT){
        GetRawInputData((HRAWINPUT)msg->lParam, RID_INPUT, nullptr, &dwSize, sizeof(RAWINPUTHEADER));
        lpb = new BYTE[dwSize];
        if (lpb == nullptr)
            return 0;
        if (GetRawInputData((HRAWINPUT)msg->lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER)) != dwSize )
            OutputDebugString (TEXT("GetRawInputData does not return correct size !\n"));
        raw = (RAWINPUT*)lpb;
        if(raw->header.dwType == RIM_TYPEHID){
            DWORD len = raw->data.hid.dwSizeHid;
            int f = (len == 0x23)?raw->data.hid.bRawData[n]:raw->data.hid.bRawData[n];
            qDebug() << f;            
        }
        delete[] lpb;
    }
    return false;
}

上述 bRawData[]bRawData[],是依据具体协议来的

标签:return,Qt,dwSize,raw,Windows,hwnd,--,rid,lpb
来源: https://blog.csdn.net/renbenliu/article/details/121902097

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有