这几天捣腾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

SetupDiGetClassDevs
HDEVINFO SetupDiGetClassDevs(
IN PGUID ClassGuid,
IN PCTSTR Enumerator,
IN HWND hwndParent,
IN DWORD Flags
);

该函数的作用是 获取一个指定类别或全部类别的所有已安装设备的信息,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)设备方法一相关推荐

  1. c# hid usb 卡死_C# 访问USB(HID)设备

    //代码暂时没有整理,传入参数是设备序号,//有些USB设备其实有很多HID设备,就是一个接口上有几个设备,这个时候需要//用index++来逐个循环,直到获取设备返回false后,跳出去,把获取的设 ...

  2. 嵌入式linux作为hid设备,基于嵌入式系统的USB(HID)设备

    基于嵌入式系统的USB(HID)设备 目前嵌入式系统在数字化电子产品领域应用越来越广泛.随着其成本的降低,大有取代单片机的趋势. USB设备以其小巧.便携.即插即用.成本低廉等优势在当前的桌面应用中有 ...

  3. C++ MFC界面读写USB HID设备数据程序

    C++ MFC界面读写USB HID设备数据程序 发一个简单易用的界面,用来对USB HID设备(比如说游戏手柄,控制面板等)读写数据,一般情况下面板上有一些LED,可以帮助我们测试读写是否正确.另外 ...

  4. hid python uhf_简单的读写Python中的USB HID设备?

    我有一个相当简单的USB HID设备,我一直在试图弄清楚如何读取和写入使用Python.我已经能够使用PyWinUSB从它读取,但是当我尝试写入它时,问题就出现了.试图写入它会使事情爆炸.简单的读写P ...

  5. 实践 C++ MFC界面读写USB HID设备数据程序

    在开发了一个多线程USB烧写程序后,得到新的任务,要将HID的内容放到里面,没有人带着做细致的讲解,靠自己自生自灭: 1, 什么是HID? (项目要的急,没有什么了解就开始了!只知道,在Windows ...

  6. USB HID 设备类协议入门

    一.应用场合 USB HID类是比较大的一个类,HID类设备属于人机交互操作的设备.用于控制计算机操作的一些方面,如USB鼠标,USB键盘,USB游戏操纵杆,USB触摸板,USB轨迹球.电话拨号设备. ...

  7. hid设备驱动linux,linux usb hid设备驱动(3)

    本文分析了蓝牙bluez协议栈中HID协议的实现. 1. 基本概念 HID协议用于人机输入设备.Bluez中关于HID的实现代码在其根目录下的input目录.蓝牙规范中包含关于HID的profile, ...

  8. USB HID设备数据的读取

    https://blog.csdn.net/DFSAE/article/details/81876573 USB设备(HID) Android下获取HID数据的方式: 1.通过读取/dev/hidra ...

  9. USB HID设备报告描述符详解

    概述: 报告在这里意思是数据传输(data transfer),而报告描述符是对这些传输的数据作用途(usage)上的说明. USB通讯协议的规范是以1ms产生一个USB帧(Frame),USB设备可 ...

最新文章

  1. (JAVA学习笔记) 关于数据类型的一些扩展-面试时经常问到的问题
  2. pycharm+itk+vtk安装及测试程序运行
  3. BZOJ-2761-不重复数字
  4. 【建议收藏】MD5 算法的Java Bean
  5. stm32学习笔记----双串口同时打开时的printf()问题
  6. 【数据结构】线性表的链式存储-单链表
  7. 中点坐标公式 矩形_压轴题必备|中考数学“动点坐标”问题,这个万能解法人人都能学会!...
  8. java循环标号_java 标号 break 自循环
  9. 从理解Future模式到仿写JUC的Future模式
  10. jQuery – 6.选择器
  11. Java CRC32基本使用
  12. php完美导出word,使用phpword插件实现word文档导出
  13. D3D11的简单字体
  14. 1. Two Sum查找列表中两数加和等于特定值Python Java
  15. python-常用算法
  16. MySQL数据库中,在读已提交和可重复读这两个不同事务隔离级别下幻读的区别
  17. Qt编写可视化大屏电子看板系统16-标准柱状图
  18. 国睿驰120gb固态硬盘测试软件,小巧极速 国睿驰精睿系列移动SSD评测
  19. windows防火墙配置(以windows server2008为例)
  20. 水桶服务器eula文件,minecraft1.8开服问题.doc

热门文章

  1. “Microsoft Office Word遇到问题需要关闭_陕南赤子_新浪博客
  2. 香橙派 ubuntu c# .net 使用ThoughtWorks.QRCodCore库生成 或识别 二维码,及报错处理方法
  3. MS project 2007 中将周六周日改为工作日
  4. 复旦大学大三学生郭泽宇攻克世界难题
  5. go语言圣经学习第一天——程序结构总结
  6. 【汇智学堂】-JS菜鸟版过河小游戏(之一---角色入场)
  7. 1-2 课程的内容安排
  8. Python实现的互联网新闻情感分析
  9. 一文搞懂Y-GC和Full GC的触发条件
  10. 新浪微博爬虫遇到的cookie rejected 问题解决办法