找回密码
 注册

QQ登录

只需一步,快速开始

搜索

C#源码 自动枚举USB HID设备 发送数据 支持兼容windows 10系统

[复制链接]
Jonsa 发表于 2022-4-24 03:02:49 | 显示全部楼层 |阅读模式
C#编写的自动查找USB HID设备并传输数据,运行自动枚举全部USB HID 设备,从列表中选择并点击连接即可接收数据到PC端,支持win10系统,已测试
完整源码: USBHIDControl.zip (247.65 KB, 售价: 5 E币)
1.png 2.png

部分源码:
  1. /// <summary>
  2.         /// 获取所有连接HID的设备
  3.         /// </summary>
  4.         /// <param name="deviceList">返回所有连接HID的设备</param>
  5.         private void GetDeviceList(ref List<string> deviceList)
  6.         {
  7.             Guid HIDGuid = Guid.Empty;
  8.             windowsApi.GetDeviceGuid(ref HIDGuid);//获取HID的全局GUID
  9.             IntPtr HIDInfoSet = windowsApi.GetClassDevOfHandle(HIDGuid);//获取包含所有HID接口信息集合的句柄

  10.             if (HIDInfoSet != IntPtr.Zero)
  11.             {
  12.                 SP_DEVICE_INTERFACE_DATA interfaceInfo = new SP_DEVICE_INTERFACE_DATA();
  13.                 interfaceInfo.cbSize = Marshal.SizeOf(interfaceInfo);

  14.                 //检测集合的每个接口
  15.                 for (uint index = 0; index < MAX_USB_DEVICES; index++) {
  16.                     //获取接口信息
  17.                     if (!windowsApi.GetEnumDeviceInterfaces(HIDInfoSet, ref HIDGuid, index, ref interfaceInfo))
  18.                         continue;
  19.                     
  20.                     int buffsize=0;
  21.                     //获取接口详细信息;第一次读取错误,但可取得信息缓冲区的大小
  22.                     windowsApi.GetDeviceInterfaceDetail(HIDInfoSet,ref interfaceInfo,IntPtr.Zero, ref buffsize);
  23.                     
  24.                     //接受缓冲
  25.                     IntPtr pDetail = Marshal.AllocHGlobal(buffsize);
  26.                     SP_DEVICE_INTERFACE_DETAIL_DATA detail = new WindowsAPI.SP_DEVICE_INTERFACE_DETAIL_DATA();
  27.                     detail.cbSize = Marshal.SizeOf(typeof(USBHIDControl.WindowsAPI.SP_DEVICE_INTERFACE_DETAIL_DATA));
  28.                     Marshal.StructureToPtr(detail, pDetail, false);
  29.                     if (windowsApi.GetDeviceInterfaceDetail(HIDInfoSet, ref interfaceInfo, pDetail, ref buffsize))//第二次读取接口详细信息
  30.                         deviceList.Add(Marshal.PtrToStringAuto((IntPtr)((int)pDetail + 4)));
  31.                     Marshal.FreeHGlobal(pDetail);
  32.                 }
  33.             }

  34.             //删除设备信息并释放内存
  35.             windowsApi.DestroyDeviceInfoList(HIDInfoSet);
  36.         }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-12-27 12:41

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表