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

C#编写的自动查找USB HID设备并传输数据,运行自动枚举全部USB HID 设备,从列表中选择并点击连接即可接收数据到PC端,支持win10系统,已测试。


部分源码:

 /// <summary>
/// 获取所有连接HID的设备
/// </summary>
/// <param name="deviceList">返回所有连接HID的设备</param>
private void GetDeviceList(ref List<string> deviceList)
{
    Guid HIDGuid = Guid.Empty;
    windowsApi.GetDeviceGuid(ref HIDGuid);//获取HID的全局GUID
    IntPtr HIDInfoSet = windowsApi.GetClassDevOfHandle(HIDGuid);//获取包含所有HID接口信息集合的句柄

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

        //检测集合的每个接口
        for (uint index = 0; index < MAX_USB_DEVICES; index++) {
            //获取接口信息
            if (!windowsApi.GetEnumDeviceInterfaces(HIDInfoSet, ref HIDGuid, index, ref interfaceInfo))
                continue;
            
            int buffsize=0;
            //获取接口详细信息;第一次读取错误,但可取得信息缓冲区的大小
            windowsApi.GetDeviceInterfaceDetail(HIDInfoSet,ref interfaceInfo,IntPtr.Zero, ref buffsize);
            
            //接受缓冲
            IntPtr pDetail = Marshal.AllocHGlobal(buffsize);
            SP_DEVICE_INTERFACE_DETAIL_DATA detail = new WindowsAPI.SP_DEVICE_INTERFACE_DETAIL_DATA();
            detail.cbSize = Marshal.SizeOf(typeof(USBHIDControl.WindowsAPI.SP_DEVICE_INTERFACE_DETAIL_DATA));
            Marshal.StructureToPtr(detail, pDetail, false);
            if (windowsApi.GetDeviceInterfaceDetail(HIDInfoSet, ref interfaceInfo, pDetail, ref buffsize))//第二次读取接口详细信息
                deviceList.Add(Marshal.PtrToStringAuto((IntPtr)((int)pDetail + 4)));
            Marshal.FreeHGlobal(pDetail);
        }
    }

    //删除设备信息并释放内存
    windowsApi.DestroyDeviceInfoList(HIDInfoSet);
}