示例#1
0
        /// <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(Test_tool4product_line.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);
        }
示例#2
0
        /// <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(Test_tool4product_line.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);
        }