Qt 使用RAW INPUT获取HID触摸屏,笔设备,鼠标的原始数据,最低受支持的客户端:Windows XP [仅限桌面应用]

        在开发绘图应用程序时,经常会需要读取笔设备的数据,通过对笔数据的解析,来判断笔的坐标,粗细。如果仅仅只是读取鼠标的坐标,就需要人为在应用程序端去修改笔的粗细,并且使用体验不好,如果可以实时获取到触摸屏的笔数据的话,就可以大大提高体验感。

        获取USB-HID设备的数据,有多种方式

  1. 使用Raw Input API
  2. 使用Windows底层库,如Windows API,Windows HID API
  3. 使用第三方库,如hidapi,libusb等等

        本博文主要分析Raw Input API的操作,官网解析地址:https://learn.microsoft.com/en-us/windows/win32/inputdev/about-raw-input

        从官网的概述可以知道Raw Input API为应用程序提供了一种稳定而可靠的方式,可以接受来自任何 HID(包括键盘和鼠标)的原始输入。

        并且具有这些优点。

Qt使用Raw Input API具体步骤

  1. 注册原始输入
  2. 重写nativeEvent函数
  3. 执行原始输入的标准读取

(解析截自官网)

1.注册原始输入

        为了注册设备,应用程序首先创建 一个 RAWINPUTDEVICE 结构的数组,这些结构为所需的设备指定 顶级集合 (TLC) 。 TLC 由“使用情况页”定义, (设备) 类 (设备) 。 例如,若要获取键盘 TLC,请设置 UsagePage = 0x01 和 UsageID = 0x06。 应用程序调用 RegisterRawInputDevices 来注册设备。

        请注意,应用程序可以注册当前未附加到系统的设备。 附加此设备后,Windows 管理器将自动将原始输入发送到应用程序。 若要获取系统上的原始输入设备列表,应用程序会调用 GetRawInputDeviceList。 应用程序使用此调用中的 hDevice 调用 GetRawInputDeviceInfo 以获取设备信息。

使用页情况:

bool Dialog::RegisitWindow(HWND hwnd)
{if ( nullptr == hwnd ){return FALSE;}RAWINPUTDEVICE rid[1];rid[0].usUsagePage = 0x0D;rid[0].usUsage = 0x02; // 笔设备rid[0].dwFlags = RIDEV_INPUTSINK;rid[0].hwndTarget = hwnd;if (!RegisterRawInputDevices(rid, 1, sizeof(rid[0]))){return FALSE;}return TRUE;
}

2.重写nativeEvent函数

bool Dialog::nativeEvent(const QByteArray &eventType, void *message, long *result)
{}

3.执行原始输入的标准读取

        应用程序从任何 HID 接收原始输入,其 顶级集合 (TLC) 与注册中的 TLC 匹配。 当应用程序收到原始输入时,其消息队列将获取 WM_INPUT 消息, 并且队列 状态标志QS_RAWINPUT设置为 (QS_INPUT 还包括此标志) 。 应用程序在前台和后台时可以接收数据。

有两种方法可以读取原始数据:无缓冲 (或标准) 方法和缓冲方法。 无缓冲区方法一次获取一个 RAWINPUT 结构的原始数据,并且足以用于许多 HID。 在这里,应用程序调用 GetMessage 以获取 WM_INPUT 消息。 然后,应用程序使用包含在 WM_INPUT 中的 RAWINPUT 句柄调用 GetRawInputData。 有关示例,请参阅 执行原始输入的标准读取。

相比之下,缓冲方法一次获取 RAWINPUT 结构的数组。 这是为可以生成大量原始输入的设备提供的。 在此方法中,应用程序调用 GetRawInputBuffer 来获取 RAWINPUT 结构的数组。 请注意, NEXTRAWINPUTBLOCK 宏用于遍历 RAWINPUT 结构的数组。 有关示例,请参阅 执行原始输入的缓冲读取。

若要解释原始输入,需要有关 HID 的详细信息。 应用程序通过使用设备句柄调用 GetRawInputDeviceInfo 来获取设备信息。 此句柄可以来自 WM_INPUT,也可以来自 RAWINPUTHEADER 的 hDevice 成员。

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) {qDebug() << "内存分配失败。";return false;}if (GetRawInputData((HRAWINPUT)msg->lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER)) != dwSize) {qDebug() << "GetRawInputData 返回的大小不正确!";delete[] lpb;return false;}raw = (RAWINPUT*)lpb;if (raw->header.dwType == RIM_TYPEHID) {qDebug() << "接收到 HID 输入。";//在这里可以使用raw->data.hid.bRawData解析数据。}delete[] lpb;}return false;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/740543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux异步通知实验:驱动中异步通知的处理

一. 简介 前面几篇文章学习了 Linux异步通知机制&#xff0c;以及驱动或应用程序关于异步通知机制是如何处理的。 驱动对异步通知的处理方法如下&#xff1a; Linux应用程序对异步通知的处理-CSDN博客 本文开始通过实验&#xff0c;学习异步通知机制方法。本文具体来学习驱…

中间件面试题之MQ

MQ相关面试题 Kafka面试题 (1)rockermq和kafka 的区别在哪里? 使用场景有什么不一样? 不同点: 数据可靠性 不同: RocketMQ:支持异步实时刷盘、同步刷盘、同步复制、异步复制;kafka:使用异步刷盘方式,异步复制/同步复制。性能对比:kafka单机写入TPS比较高单机支持…

解析Perl爬虫代码:使用WWW__Mechanize__PhantomJS库爬取stackoverflow.com的详细步骤

在这篇文章中&#xff0c;我们将探讨如何使用Perl语言和WWW::Mechanize::PhantomJS库来爬取网站数据。我们的目标是爬取stackoverflow.com的内容&#xff0c;同时使用爬虫代理来和多线程技术以提高爬取效率&#xff0c;并将数据存储到本地。 Perl爬虫代码解析 首先&#xff0…

【Docker】 ubuntu18.04编译时内存不足需要使用临时交换分区解决“c++: internal compiler error“错误

【Docker】 ubuntu18.04编译时内存不足需要使用临时交换分区解决"c: internal compiler error"错误 问题描述 安装独立功能包时编译不成功&#xff0c;出现 “c: internal compiler error: Killed(program cciplus)” 错误。 解决方案 出现这个问题的原因大概率是…

模拟电子技术实验(二)

单选题 1. 本实验的实验目的中&#xff0c;输出电阻测量是第几个目的&#xff1f; A. 1个。 B. 2个。 C. 3个。 D. 4个。 答案&#xff1a;C 评语&#xff1a;10分 单选题 2.本实验电路有一个元件参数有问题&#xff0c;需要修改&#xff1f; A. …

[数据集][目标检测]变电站缺陷检测数据集VOC+YOLO格式8307张17类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;8307 标注数量(xml文件个数)&#xff1a;8307 标注数量(txt文件个数)&#xff1a;8307 标注…

如何理解Redis中的缓存雪崩,缓存穿透,缓存击穿?

目录 一、缓存雪崩 1.1 解决缓存雪崩问题 二、缓存穿透 2.1 解决缓存穿透 三、缓存击穿 3.1 解决缓存击穿 3.2 如何保证数据一致性问题&#xff1f; 一、缓存雪崩 缓存雪崩是指短时间内&#xff0c;有大量缓存同时过期&#xff0c;导致大量的请求直接查询数据库&#xf…

三维卡通数字人解决方案,支持unity和Maya

企业对于品牌形象和宣传手段的创新需求日益迫切&#xff0c;美摄科技凭借其在三维卡通数字人领域的深厚积累&#xff0c;推出了面向企业的三维卡通数字人解决方案&#xff0c;帮助企业轻松打造独具特色的虚拟形象&#xff0c;提升品牌影响力和市场竞争力。 美摄科技的三维卡通…

Postman请求API接口测试步骤和说明

Postman请求API接口测试步骤 本文测试的接口是国内数智客&#xff08;www.shuzike.com&#xff09;的API接口手机三要素验证&#xff0c;验证个人的姓名&#xff0c;身份证号码&#xff0c;手机号码是否一致。 1、设置接口的Headers参数。 Content-Type&#xff1a;applicati…

安卓Java面试题 61- 70

61. 如何启动Activity是就启动一个service?首先定义好一个service,然后在Activity的onCreate里面进行连接并bindservice或者直接startService。🚀🚀🚀🚀🚀🚀 62. Activity与service绑定方式阐述 ?1、activity能进行绑定得益于Serviece的接口。为了支持Service的…

Kafka消费者重平衡

「&#xff08;重平衡&#xff09;Rebalance本质上是一种协议&#xff0c;规定了一个Consumer Group下的所有Consumer如何达成一致&#xff0c;来分配订阅Topic的每个分区」。 比如某个Group下有20个Consumer实例&#xff0c;它订阅了一个具有100个分区的Topic。 正常情况下&…

Mac 免费模拟器推荐适配m1芯片

以下是一些在 macOS 上推荐安装的 Android 模拟器&#xff1a; Bluestacks&#xff1a;Bluestacks 是一款功能强大的 Android 模拟器&#xff0c;支持在 Mac 上运行 Android 应用程序和游戏。它具有良好的兼容性和稳定性。 Nox App Player&#xff1a;Nox App Player 是另一款…

【2024.03.12】定时执行专家 V7.2 发布 - TimingExecutor V7.2 Release

目录 ▉ 软件介绍 ▉ 新版本 V7.2 下载地址 ▉ V7.2 新功能 ▼2024-03-12 V7.2 - 更新日志 ▉ V7.x 新UI设计 ▉ 软件介绍 《定时执行专家》是一款制作精良、功能强大、毫秒精度、专业级的定时任务执行软件。软件具有 25 种【任务类型】、12 种【触发器】触发方式&#x…

【C++算法模板】图的存储-邻接矩阵

文章目录 邻接矩阵洛谷3643 图的存储 邻接矩阵 邻接矩阵相比于上一篇博客邻接表的讲解要简单得多 数据结构&#xff0c;如果将二维数组 g g g 定义为全局变量&#xff0c;那默认初始化应该为 0 0 0 &#xff0c;如果题目中存在自环&#xff0c;可以做特判&#xff0c; m e …

因为manifest.json文件引起的 android-chrome-192x192.png 404 (Not Found)

H5项目打包之后&#xff0c;总是有这个报错&#xff0c;有时候还有别的icon也找不见 一通调查之后&#xff0c;发现是因为引入了一个vue插件 这个插件引入之后&#xff0c;webpack打包的时候就会自动在dist文件夹中产生一个manifest.json文件这个文件里面主要就是一些icon地址的…

制作图片马:二次渲染(upload-labs第17关)

代码分析 $im imagecreatefromjpeg($target_path);在本关的代码中这个imagecreatefromjpeg();函数起到了将上传的图片打乱并重新组合。这就意味着在制作图片马的时候要将木马插入到图片没有被改变的部分。 gif gif图的特点是无损&#xff0c;我们可以对比上传前后图片的内容…

1792. 最大平均通过率

文章目录 题意思路代码 题意 题目链接 给了每个班的人数和通过人数&#xff0c;给了一堆必考过的学生,分配给了不同班&#xff0c;让平均班的通过率最高。 思路 看分配给不同班的收益率&#xff0c;优先最高收益率&#xff0c;使用优先队列 代码 class Solution { public:…

linux内建命令/内部命令之exec

1.exec介绍 exec是linux shell内建命令&#xff0c;该命令将使用一个特定的命令来取代当前进程。一般当shell遇到一个命令&#xff0c;它会forks off一个子进程来真正的运行命令&#xff0c;但使用exec内建命令&#xff0c;shell就不会fork一个子进程了&#xff0c;并且命令的…

【问题解决】VMWare虚拟机主IP地址:网络信息不可用

在今天想用man命令查看相关函数的帮助时&#xff0c;突然发现自己的XShell连接不上虚拟机&#xff0c;通过在终端使用ifconfig命令也只查看得到本地回环&#xff0c;虽然最近常遇到这个问题&#xff0c;但一般通过重启虚拟机就能得以解决。 不过这次重启也不奏效了&#xff0c…

Java输出流之BufferWriter类

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…