QT做一个USB HID设备识别软件

1.下载 HidApi库:GitHub - yigityuce/HidApi: Human Interface Device Api (HidApi) with C++ 

2.pro文件添加

DEFINES -= UNICODE
LIBS += -lsetupapi

3.h文件

#ifndef My_Usb_Hid_Device_H
#define My_Usb_Hid_Device_H#include <QWidget>
#include <QString>
#include <QDir>
#include <QFileDialog>
#include <QDebug>
#include "Redefine/MyTextEdit.h"
#include "Redefine/MyLabel.h"
#include "Redefine/MyToolButton.h"
#include "UsbHidApi/HidApi.h"
#include "Redefine/MyComboBox.h"class My_Usb_Hid_Device: public QWidget
{
public:My_Usb_Hid_Device();void setParent(QWidget *parent);void resize(int w, int h);void Open_File_Button_Clicked();void Open_Device_Button_Clicked();void Clear_Button_Clicked();void USB_HID_Listen_Clicked();QString FilePath;QString FileString;int Get_File_Size;bool USB_HID_DEVICE_IsOpen = false;HidApi hidApi;HidDevice hidDev;//HID设备HidDeviceList devList;//HID设备列表HidDeviceList Last_devList;//HID设备列表MyLabel Update_File_Path_Lable;MyTextEdit File_Path_Edit;MyToolButton Open_File_Button;MyComboBox Usb_PidVid_Box;MyLabel Pid_Lable;MyLabel Vid_Lable;QTextEdit Pid_Edit;QTextEdit Vid_Edit;MyComboBox Usb_Type_Box;MyToolButton Open_Device_Button;MyToolButton Clear_Button;QTextEdit Out_Edit;
};#endif // My_Usb_Hid_Device_H

 4.CPP文件

#include "My_Usb_Hid_Device.h"My_Usb_Hid_Device::My_Usb_Hid_Device()
{FilePath = QDir::homePath();FilePath += "/Desktop/";File_Path_Edit.setText(FilePath);hidApi.isInitialized();Last_devList = devList = hidApi.scanDevices();for(size_t i = 0; i < devList.size(); i++)//可打印扫描到的设备的信息{qDebug() << i + 1 << ". DEVICE\n";qDebug() << "Path        : " << devList[i].getPath().c_str();qDebug() << "Vendor Id   : " << devList[i].getVendorId();qDebug() << "Product Id  : " << devList[i].getProductId();//qDebug() << "Serial      : " << devList[i].getSerial();//qDebug() << "Manufacturer: " << devList[i].getManufacturer();//qDebug() << "Product     : " << devList[i].getProductString();qDebug() << "Release No  : " << devList[i].getRelease();qDebug() << "Usage Page  : " << devList[i].getUsagePage();qDebug() << "Usage       : " << devList[i].getUsage();qDebug() << "Interface   : " << devList[i].getInterface();qDebug() << "-----------------------------------------------";Out_Edit.append(QString("%1").arg(i) + ". DEVICE");Out_Edit.append(devList[i].getPath().c_str());Out_Edit.append("Serial      : " + QString::fromStdWString(devList[i].getSerial()));Out_Edit.append("Manufacturer: " + QString::fromStdWString(devList[i].getManufacturer()));Out_Edit.append("Product     : " + QString::fromStdWString(devList[i].getProductString()));Out_Edit.append("Vendor Id   : " + QString("0X%1").arg(devList[i].getVendorId(), 4, 16, QLatin1Char('0')));Out_Edit.append("Product Id  : " + QString("0X%1").arg(devList[i].getProductId(),4, 16, QLatin1Char('0')));Out_Edit.append("Release No  : " + QString("%1").arg(devList[i].getRelease(),    4, 10, QLatin1Char('0')));Out_Edit.append("Usage Page  : " + QString("%1").arg(devList[i].getUsagePage(),  4, 10, QLatin1Char('0')));Out_Edit.append("Usage       : " + QString("%1").arg(devList[i].getUsage(),      4, 10, QLatin1Char('0')));Out_Edit.append("Interface   : " + QString("%1").arg(devList[i].getInterface(),  4, 10, QLatin1Char('0')));Out_Edit.append(0);//Usb_PidVid_Box.addItem(QString("%1").arg(i));Usb_PidVid_Box.addItem(QString::fromStdWString(devList[i].getManufacturer()) + ":VID:" + QString("%1").arg(devList[i].getVendorId()) + "PID:" + QString("%1").arg(devList[i].getProductId()));}
}void My_Usb_Hid_Device::setParent(QWidget *parent)
{Update_File_Path_Lable.setParent(parent);Update_File_Path_Lable.setText("升级文件路径");File_Path_Edit.setParent(parent);Open_File_Button.setParent(parent);Open_File_Button.setText("打开文件");Usb_PidVid_Box.setParent(parent);Pid_Lable.setParent(parent);Pid_Lable.setText("PID");Vid_Lable.setParent(parent);Vid_Lable.setText("VID");Pid_Edit.setParent(parent);Vid_Edit.setParent(parent);Usb_Type_Box.setParent(parent);Open_Device_Button.setParent(parent);Open_Device_Button.setText("打开设备");Clear_Button.setParent(parent);Clear_Button.setText("清除显示");Usb_Type_Box.addItem(QString("系统设备"));Usb_Type_Box.addItem(QString("自定义设备"));QFont Font;Font.setPixelSize(30);Pid_Edit.setAlignment(Qt::AlignCenter);Pid_Edit.setFont(Font);Vid_Edit.setAlignment(Qt::AlignCenter);Vid_Edit.setFont(Font);Out_Edit.setParent(parent);
}void My_Usb_Hid_Device::resize(int w, int h)
{int Lable_Y = (h / 10);int Path_Edit_X = (w / 10) * 4;int Path_Edit_Y = Lable_Y;int Show_Edit_X = w;int Show_Edit_Y = h - Lable_Y * 2;int Button_X = (w / 10) * 1;int Button_Y = Lable_Y;Update_File_Path_Lable.resize(Path_Edit_X, Path_Edit_Y);Update_File_Path_Lable.move(0, 0);File_Path_Edit.resize(Path_Edit_X, Path_Edit_Y);File_Path_Edit.move(Path_Edit_X, 0);Open_File_Button.resize(Button_X * 2, Button_Y);Open_File_Button.move(Path_Edit_X * 2, 0);Usb_PidVid_Box.resize(Button_X * 3, Button_Y);Usb_PidVid_Box.move(0, Lable_Y);Pid_Lable.resize(Button_X, Button_Y);Pid_Lable.move(Button_X * 3, Lable_Y);Pid_Edit.resize(Button_X, Button_Y);Pid_Edit.move(Button_X * 4, Lable_Y);Vid_Lable.resize(Button_X, Button_Y);Vid_Lable.move(Button_X * 5, Lable_Y);Vid_Edit.resize(Button_X, Button_Y);Vid_Edit.move(Button_X * 6, Lable_Y);Usb_Type_Box.resize(Button_X, Button_Y);Usb_Type_Box.move(Button_X * 7, Lable_Y);Open_Device_Button.resize(Button_X, Button_Y);Open_Device_Button.move(Button_X * 8, Lable_Y);Clear_Button.resize(Button_X, Button_Y);Clear_Button.move(Button_X * 9, Lable_Y);Out_Edit.resize(Show_Edit_X, Show_Edit_Y);Out_Edit.move(0, Path_Edit_Y + Lable_Y);
}void My_Usb_Hid_Device::Open_File_Button_Clicked()
{FilePath = QFileDialog::getOpenFileName(this, "打开文件", FilePath, "*.bin;;*.hex");File_Path_Edit.setText(FilePath);if(FilePath.isEmpty()){//QMessageBox::warning(this,"警告","没有选择文件");return;}else{}
}void My_Usb_Hid_Device::Open_Device_Button_Clicked()
{hidDev = devList[Usb_PidVid_Box.currentIndex()];if(hidDev.isInitialized()){if(USB_HID_DEVICE_IsOpen == true){USB_HID_DEVICE_IsOpen = false;Open_Device_Button.setText("打开设备");hidDev.close();}else{USB_HID_DEVICE_IsOpen = hidDev.open();if(USB_HID_DEVICE_IsOpen){USB_HID_DEVICE_IsOpen = true;Open_Device_Button.setText("关闭设备");if(hidDev.readAvailable())//假如有数据可读{std::string ring = hidDev.read(-1);//从设备读取数据}}}}Out_Edit.clear();Out_Edit.append("Manufacturer: " + QString::fromStdWString(devList[Usb_PidVid_Box.currentIndex()].getManufacturer()));Out_Edit.append("Vendor Id   : " + QString("0X%1").arg(devList[Usb_PidVid_Box.currentIndex()].getVendorId(), 4, 16, QLatin1Char('0')));Out_Edit.append("Product Id  : " + QString("0X%1").arg(devList[Usb_PidVid_Box.currentIndex()].getProductId(),4, 16, QLatin1Char('0')));//hidDev.close();
}void My_Usb_Hid_Device::Clear_Button_Clicked()
{Out_Edit.clear();
}void My_Usb_Hid_Device::USB_HID_Listen_Clicked()
{devList = hidApi.scanDevices();if(Last_devList.size() != devList.size()){Last_devList = devList;Usb_PidVid_Box.clear();for(size_t i = 0; i < devList.size(); i++)//可打印扫描到的设备的信息{Out_Edit.append(QString("%1").arg(i) + ". DEVICE");Out_Edit.append(devList[i].getPath().c_str());Out_Edit.append("Serial      : " + QString::fromStdWString(devList[i].getSerial()));Out_Edit.append("Manufacturer: " + QString::fromStdWString(devList[i].getManufacturer()));Out_Edit.append("Product     : " + QString::fromStdWString(devList[i].getProductString()));Out_Edit.append("Vendor Id   : " + QString("0X%1").arg(devList[i].getVendorId(), 4, 16, QLatin1Char('0')));Out_Edit.append("Product Id  : " + QString("0X%1").arg(devList[i].getProductId(),4, 16, QLatin1Char('0')));Out_Edit.append("Release No  : " + QString("%1").arg(devList[i].getRelease(),    4, 10, QLatin1Char('0')));Out_Edit.append("Usage Page  : " + QString("%1").arg(devList[i].getUsagePage(),  4, 10, QLatin1Char('0')));Out_Edit.append("Usage       : " + QString("%1").arg(devList[i].getUsage(),      4, 10, QLatin1Char('0')));Out_Edit.append("Interface   : " + QString("%1").arg(devList[i].getInterface(),  4, 10, QLatin1Char('0')));Out_Edit.append(0);Usb_PidVid_Box.addItem(QString::fromStdWString(devList[i].getManufacturer()) + ":VID:" + QString("%1").arg(devList[i].getVendorId()) + "PID:" + QString("%1").arg(devList[i].getProductId()));}}
}

 5.看看效果

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全知识:什么是访问控制列表 (ACL)?

访问控制列表 (ACL) 是网络安全和管理的基础。它们在确定谁或什么可以访问网络内的特定资源方面发挥着重要作用。 本文深入探讨了 ACL 的复杂性&#xff0c;探索了其类型、组件、应用程序和最佳实践。我们还将比较不同操作系统的 ACL&#xff0c;并讨论它们在网络架构中的战略…

时序分解预测|基于变分模态分解VMD双向长短期记忆网络BiLSTM的单变量时间序列预测Matalb程序VMD-BiLSTM

时序分解预测|基于变分模态分解VMD双向长短期记忆网络BiLSTM的单变量时间序列预测Matalb程序VMD-BiLSTM 文章目录 前言时序分解预测|基于变分模态分解VMD双向长短期记忆网络BiLSTM的单变量时间序列预测Matalb程序VMD-BiLSTM 一、VMD-BiLSTM模型VMD-BiLSTM模型详细原理和流程1. …

bootstrap下拉多选框

1、引用(引用资源下载) <!-- Latest compiled and minified CSS --> <link rel"stylesheet" href"static/css/bootstrap-select.min.css"> <!-- Latest compiled and minified JavaScript --> <script src"static/js/bootstrap…

为什么IGSO卫星星下点轨迹为“8”字?

前言 IGSO&#xff0c;倾斜地球同步轨道(Inclined GeoSynchronous Orbit)&#xff0c;又名GIO (Geosynchronous Inclined Orbit)。高度与GEO(Geostationary Orbit)相同&#xff0c;都是约35700km&#xff08;我国北斗系统部分卫星就用该轨道&#xff0c;轨道高度约35786km&…

Linux awk案例

目录 1. 查询时间超过2000毫秒的请求2. 查询指定列组合出现的次数3. 统计所有文件的大小4. 获取大于指定大小的文件名&#xff0c;并按照从大到小排序5. grep指定字段后&#xff0c;使用awk列转行6. 查询第四个字段等于指定值的内容 1. 查询时间超过2000毫秒的请求 ✅log: 202…

Ubuntu 24.04 VMware里面设置静态ip上网

1.VMware里面设置网络为桥接模式 2.Ubuntu里面检查网卡名称 [~] ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:…

2024表白墙PHP网站源码

2024表白墙PHP网站源码 正常安装 访问域名即可直接进入安装程序 更新安装 请先备份数据库以及updata文件目录 以防出现意外 以及复制后台“基本配置内容” 然后覆盖目录 访问域名再次进入安装程序 在数据库安装完成后不要进行下一步并删除install文件目录 再将“基本配置内容”…

ElasticSearch添加xpack认证

一、新增xpack依赖包 由于xpack包需要从es的私服仓库下载&#xff0c;在data-platform-parent工程下的pom.xml新增如下&#xff1a; <properties><x-pack-transport.version>5.5.3</x-pack-transport.version> </properties><repositories><…

数据结构基本知识

一、什么是数据结构 1.1、组织存储数据 ---------》内存&#xff08;存储&#xff09; 1.2、研究目的 如何存储数据&#xff08;变量&#xff0c;数组....)程序数据结构算法 1.3、常见保存数据的方法 数组&#xff1a;保存自己的数据指针&#xff1a;是间接访问已经存在的…

摄影竞赛系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;教师管理&#xff0c;学生管理&#xff0c;辅导员管理&#xff0c;项目信息管理&#xff0c;作品信息管理&#xff0c;留言板管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#…

【Leetcode】1-5

1 两数之和 1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; 和为目标值 target 就是在找 target - nums[i] 利用 哈希表 查找只需要 O(1) class Solution {public int[] twoSum(int[] nums, int target) {HashMap<Integer, Integer> hm new HashMap<>();…

钢铁百科:NM360钢板材质、NM360机械性能、NM360韧性焊接性能

一、NM360钢板材质&#xff1a; NM360是一种高强度耐磨钢板&#xff0c;具有良好的综合机械性能和耐磨性能。它通常用于制造各种机械设备的耐磨部件&#xff0c;如挖掘机斗齿、破碎机锤头、磨煤机叶片等。NM360钢板的化学成分和热处理工艺被精心设计&#xff0c;以确保其在恶劣…

【Python知识宝库】深入理解Python中的字符串操作

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言一、字符串的创建1.1 使用引号创建字符串1.2 使用字符串函数创建 二、字符串的修改2.1 更改字符串的大小写2.2 拼…

心电调试笔记

原理图设计 注意事项 引脚连接检查&#xff1a;确保每个元器件与芯片引脚连接正确是基础&#xff0c;错误的连接可能导致系统无法正常工作。未连接引脚标识&#xff1a;对于未使用的引脚&#xff0c;虽然不连接但应标识为非使用状态&#xff0c;以免混淆或引起误操作。测试点设…

学学vue-1

vue 0 安装 装node.js&#xff0c;以及cnpm&#xff08;npm超时或者被屏蔽&#xff0c;安装cnpm国内镜像&#xff09; 查看安装版本&#xff08;是否安装成功&#xff09; node -v 安装成功之后也会安装npm npm -v cnpm镜像 npm install -g cnpm --registryhttp://registry.np…

哈希:哈希函数 | 哈希概念 | 哈希冲突 | 闭散列 | 开散列

&#x1f308;个人主页&#xff1a; 南桥几晴秋 &#x1f308;C专栏&#xff1a; 南桥谈C &#x1f308;C语言专栏&#xff1a; C语言学习系列 &#x1f308;Linux学习专栏&#xff1a; 南桥谈Linux &#x1f308;数据结构学习专栏&#xff1a; 数据结构杂谈 &#x1f308;数据…

GEE APP——Bellingcat 雷达影像监测平台分析

简介 许多军用雷达在开启时会干扰开源卫星图像。 一个新工具可以让任何人监控这些雷达部署的时间和地点。 该资源库包含该工具的源代码。 下面是该工具使用时的截图,其中有五个标注组件,我们将逐一查看。 在此示例中,该工具以驻扎在沙特阿拉伯达曼的 MIM-104 爱国者 PAC-2 …

早上醒来嗓子干、喉咙痛、咳嗽……快用这个润养好物,给嗓子做个spa,让身体润起来~

进入秋季&#xff0c;很多人出现了眼睛干涩、大便干燥、嘴唇干裂、咽喉疼痛等症状&#xff0c;虽说这些还能够忍受&#xff0c;但它却影响了正常的饮食和休息。 秋季气候干燥&#xff0c;外界燥邪侵犯肺部&#xff0c;易伤津液&#xff0c;肺失滋润&#xff0c;清肃失司&#x…

探讨马丁格尔策略应用的3问和昂首平台的3答

问&#xff1a;为什么在使用马丁格尔策略时要如此谨慎?毕竟最大的市场波动可能根本不会发生。 答&#xff1a;让我们以一个具体的例子来说明这个问题。假设我们进行交易&#xff0c;计算出一个小于最大预期值的市场动量&#xff0c;比如说这个值为90便士。试想&#xff0c;如…