C# 访问USB(HID)设备方法一
这几天捣腾C# 访问USB(HID)设备的方式,看了好多资料,发现有两种方式访问USB设备,废话少说直接看核心代码
h = Win32Wrapper.SetupDiGetClassDevs(IntPtr.Zero, DevEnum, IntPtr.Zero, (int)(Win32Wrapper.DIGCF.DIGCF_PRESENT | Win32Wrapper.DIGCF.DIGCF_ALLCLASSES));
if (h.ToInt32() != INVALID_HANDLE_VALUE)
{
bool Success = true;
uint i = 0;
while (Success)
{
if (Success)
{
UInt32 RequiredSize = 0;
UInt32 RegType = 0;
IntPtr Ptr = IntPtr.Zero;
//Create a Device Info Data structure
Win32Wrapper.SP_DEVINFO_DATA DevInfoData = new Win32Wrapper.SP_DEVINFO_DATA();
DevInfoData.cbSize = (uint)Marshal.SizeOf(DevInfoData);
Success = Win32Wrapper.SetupDiEnumDeviceInfo(h, i, ref DevInfoData);
if (Success)
{
//Get the required buffer size
//First query for the size of the hardware ID, so we can know how big a buffer to allocate for the data.
Win32Wrapper.SetupDiGetDeviceRegistryProperty(h, ref DevInfoData, (UInt32)Win32Wrapper.SPDRP.SPDRP_HARDWAREID, ref RegType, IntPtr.Zero, 0, ref RequiredSize);
LastError = (Win32Wrapper.WinErrors)Marshal.GetLastWin32Error();
if (LastError == Win32Wrapper.WinErrors.ERROR_INSUFFICIENT_BUFFER)
{
if (RequiredSize > BUFFER_SIZE)
{
Status = false;
}
else
{
if (Win32Wrapper.SetupDiGetDeviceRegistryProperty(h, ref DevInfoData, (UInt32)Win32Wrapper.SPDRP.SPDRP_HARDWAREID, ref RegType, IntPtrBuffer, BUFFER_SIZE, ref RequiredSize))
{
string HardwareID = Marshal.PtrToStringAuto(IntPtrBuffer);
HardwareID = HardwareID.ToLowerInvariant();
if (HardwareID.Contains(ExpectedDeviceID))
{
}
}
}
//以上为核心代码
主要的API有:
1、SetupDiGetClassDevs
该函数的作用是 获取一个指定类别或全部类别的所有已安装设备的信息,IN DWORD Flags这个参数设置为DIGCF_ALLCLASSES 则返回所有类别的设备信息表。代码中设备信息表返回存在h中。
2、SetupDiEnumDeviceInfo
BOOLEAN
SetupDiEnumDeviceInfo(
IN HDEVINFO DeviceInfoSet,
IN DWORD MemberIndex,
OUT PSP_DEVINFO_DATA DeviceInfoData
);
枚举指定设备信息集合的成员,信息存在PSP_DEVINFO_DATA 中
参数说明:
DeviceInfoSet
提供一个设备信息集合的句柄
MemberIndex
指定一个要取得的设备信息成员序号,从0开始
DeviceInfoData
指向SP_DEVINFO_DATA结构的指针,关于指定成员的返回信息就放在该结构中
Return ValueThe
成功返回True,否则返回False)
如果要枚举全部设备信息成员,装载者首先应该将MemberIndex设为0调用SetupDiEnumDeviceInfo,然后递增MemberIndex(使用一个for循环),调用SetupDiEnumDeviceInfo,直至所有成员全部遍历(此时函数返回False,并且GetLastError返回ERROR_NO_MORE_ITEMS)
3、SetupDiGetDeviceRegistryProperty
public static extern bool SetupDiGetDeviceRegistryProperty(
IntPtr DeviceInfoSet,
ref SP_DEVINFO_DATA DeviceInfoData, //ref
UInt32 Property,
ref UInt32 PropertyRegDataType,
IntPtr PropertyBuffer,
UInt32 PropertyBufferSize,
ref UInt32 RequiredSize
);
函数用来检索指定的即插即用设备特性,该函数两次调用
参数说明:
DeviceInfoSet 给出设备信息集的一个句柄
DeviceInfoData 给出一个SP_DEVINFO_DATA 类型指针,他包含了要检索有即插即用特性的实例
Property标识特性
PropertyBuffer 设备信息存储在这个参数
最后条用HardwareID.Contains(ExpectedDeviceID)检测设备是否含有自己所定义的PID VID就可以了
初次写博客,有很多不足的地方,敬请谅解
C# 访问USB(HID)设备方法一相关推荐
- c# hid usb 卡死_C# 访问USB(HID)设备
//代码暂时没有整理,传入参数是设备序号,//有些USB设备其实有很多HID设备,就是一个接口上有几个设备,这个时候需要//用index++来逐个循环,直到获取设备返回false后,跳出去,把获取的设 ...
- 嵌入式linux作为hid设备,基于嵌入式系统的USB(HID)设备
基于嵌入式系统的USB(HID)设备 目前嵌入式系统在数字化电子产品领域应用越来越广泛.随着其成本的降低,大有取代单片机的趋势. USB设备以其小巧.便携.即插即用.成本低廉等优势在当前的桌面应用中有 ...
- C++ MFC界面读写USB HID设备数据程序
C++ MFC界面读写USB HID设备数据程序 发一个简单易用的界面,用来对USB HID设备(比如说游戏手柄,控制面板等)读写数据,一般情况下面板上有一些LED,可以帮助我们测试读写是否正确.另外 ...
- hid python uhf_简单的读写Python中的USB HID设备?
我有一个相当简单的USB HID设备,我一直在试图弄清楚如何读取和写入使用Python.我已经能够使用PyWinUSB从它读取,但是当我尝试写入它时,问题就出现了.试图写入它会使事情爆炸.简单的读写P ...
- 实践 C++ MFC界面读写USB HID设备数据程序
在开发了一个多线程USB烧写程序后,得到新的任务,要将HID的内容放到里面,没有人带着做细致的讲解,靠自己自生自灭: 1, 什么是HID? (项目要的急,没有什么了解就开始了!只知道,在Windows ...
- USB HID 设备类协议入门
一.应用场合 USB HID类是比较大的一个类,HID类设备属于人机交互操作的设备.用于控制计算机操作的一些方面,如USB鼠标,USB键盘,USB游戏操纵杆,USB触摸板,USB轨迹球.电话拨号设备. ...
- hid设备驱动linux,linux usb hid设备驱动(3)
本文分析了蓝牙bluez协议栈中HID协议的实现. 1. 基本概念 HID协议用于人机输入设备.Bluez中关于HID的实现代码在其根目录下的input目录.蓝牙规范中包含关于HID的profile, ...
- USB HID设备数据的读取
https://blog.csdn.net/DFSAE/article/details/81876573 USB设备(HID) Android下获取HID数据的方式: 1.通过读取/dev/hidra ...
- USB HID设备报告描述符详解
概述: 报告在这里意思是数据传输(data transfer),而报告描述符是对这些传输的数据作用途(usage)上的说明. USB通讯协议的规范是以1ms产生一个USB帧(Frame),USB设备可 ...
最新文章
- (JAVA学习笔记) 关于数据类型的一些扩展-面试时经常问到的问题
- pycharm+itk+vtk安装及测试程序运行
- BZOJ-2761-不重复数字
- 【建议收藏】MD5 算法的Java Bean
- stm32学习笔记----双串口同时打开时的printf()问题
- 【数据结构】线性表的链式存储-单链表
- 中点坐标公式 矩形_压轴题必备|中考数学“动点坐标”问题,这个万能解法人人都能学会!...
- java循环标号_java 标号 break 自循环
- 从理解Future模式到仿写JUC的Future模式
- jQuery – 6.选择器
- Java CRC32基本使用
- php完美导出word,使用phpword插件实现word文档导出
- D3D11的简单字体
- 1. Two Sum查找列表中两数加和等于特定值Python Java
- python-常用算法
- MySQL数据库中,在读已提交和可重复读这两个不同事务隔离级别下幻读的区别
- Qt编写可视化大屏电子看板系统16-标准柱状图
- 国睿驰120gb固态硬盘测试软件,小巧极速 国睿驰精睿系列移动SSD评测
- windows防火墙配置(以windows server2008为例)
- 水桶服务器eula文件,minecraft1.8开服问题.doc
热门文章
- “Microsoft Office Word遇到问题需要关闭_陕南赤子_新浪博客
- 香橙派 ubuntu c# .net 使用ThoughtWorks.QRCodCore库生成 或识别 二维码,及报错处理方法
- MS project 2007 中将周六周日改为工作日
- 复旦大学大三学生郭泽宇攻克世界难题
- go语言圣经学习第一天——程序结构总结
- 【汇智学堂】-JS菜鸟版过河小游戏(之一---角色入场)
- 1-2 课程的内容安排
- Python实现的互联网新闻情感分析
- 一文搞懂Y-GC和Full GC的触发条件
- 新浪微博爬虫遇到的cookie rejected 问题解决办法