如何确定哪些 USB 设备已连接到计算机上?

作者&投稿:郜之 (若有异议请与网页底部的电邮联系)
怎么确定哪些 USB 设备已连接到计算机上~

第一、在电脑桌面上找到“我的电脑”图标,右击选择“属性”按钮
第二、打开系统页面之后,选择“控制面板主页”按钮
第三、打开电脑的控制面板,选择“硬件和声音”选项,点击进去
第四、页面右上角显示“设备5”,USB在本电脑连接了总共5个设备;你还可以选择“添加设备”按钮来添加新的设备。

// DeviceManager.cpp : 定义控制台应用程序的入口点。

#include
#include
#include
#include
#define DIRECTINPUT_VERSION 0x0800
#include
extern "C"
{
#include
}
#include
#pragma comment(lib, "Dinput8.lib")
#pragma comment(lib, "Dinput.lib")
#pragma comment(lib, "Setupapi.lib")
#pragma comment(lib, "hid.lib")
GUID myGuid;
LPDIRECTINPUT8 m_lpDI; // DI8接口指针

LPDIENUMDEVICESCALLBACK DIEnumDevicesCallback(const DIDEVICEINSTANCE* lpddi, VOID* pvRef)
{
*(GUID*) pvRef = lpddi->guidInstance;


return DIENUM_STOP;
}

int main(void)
{
GUID HidGuid;

// 查找本系统中HID类的GUID标识
HidD_GetHidGuid(&HidGuid);
printf("系统中HID类的GUID标识为:%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x
",
HidGuid.Data1,HidGuid.Data2 ,HidGuid.Data3 ,
HidGuid.Data4[0],HidGuid.Data4[1],HidGuid.Data4[2],
HidGuid.Data4[3],HidGuid.Data4[4],HidGuid.Data4[5],
HidGuid.Data4[6],HidGuid.Data4[7]);

// 准备查找符合HID规范的USB设备
HDEVINFO hDevInfo = SetupDiGetClassDevs(
&HidGuid,
NULL,
NULL,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

if (hDevInfo == INVALID_HANDLE_VALUE)
{
printf("符合HID规范的USB设备发生错误
");

return 0;
}

printf("正在查找可用的USB设备。。。。
");

DWORD MemberIndex = 0;
SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
BOOL bSuccess = FALSE;

DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
do
{
bSuccess = SetupDiEnumDeviceInterfaces(
hDevInfo,
NULL,
&HidGuid,
MemberIndex,
&DeviceInterfaceData);
if ((!bSuccess) && (GetLastError() == ERROR_NO_MORE_ITEMS))
{
if(MemberIndex == 0)
{
printf("抱歉,未找到可用的USB设备!
");
}
else
{
printf("没有更多的可用的USB设备!
");
}
SetupDiDestroyDeviceInfoList(hDevInfo);
return 0;
}

printf("找到了一个USB设备:
");
// 若找到了一个USB设备,则获取该设备的细节信息
PSP_DEVICE_INTERFACE_DETAIL_DATA pDeviceInterfaceDetailData;
DWORD Length = 0;

SetupDiGetDeviceInterfaceDetail(
hDevInfo,
&DeviceInterfaceData,
NULL,
0,
&Length,
NULL);
pDeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(Length);
pDeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); //MUST BE!!!

if (!SetupDiGetDeviceInterfaceDetail(
hDevInfo,
&DeviceInterfaceData,
pDeviceInterfaceDetailData,
Length,
NULL,
NULL))
{
printf("查找路径设备时出错!
");
}
else
{
printf("设备路径:%s ", pDeviceInterfaceDetailData->DevicePath);
}
//打开设备句柄
HANDLE hDeviceHandle = CreateFile(pDeviceInterfaceDetailData->DevicePath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if (hDeviceHandle == INVALID_HANDLE_VALUE)
{
printf("打开设备路径出错!
");
// printf("%d", GetLastError());
}
else
{
HIDD_ATTRIBUTES Attributes;
HidD_GetAttributes(hDeviceHandle,&Attributes);

/**************************************************/
/*
long result;
int ReadBuffer[10];
int flag;
do
{
ReadBuffer[9] = 0;
ReadBuffer[8] = 0;
ReadBuffer[7] = 0;
ReadBuffer[6] = 0;
ReadBuffer[5] = 0;
ReadBuffer[4] = 0;
ReadBuffer[3] = 0;
ReadBuffer[2] = 0;
ReadBuffer[1] = 0;
ReadBuffer[0] = 0;
result = HidD_GetFeature(
hDeviceHandle,
(PVOID)ReadBuffer,
0x09);
// for (int i = 0; i < ReadBuffer[1]; i++)
{
//printf("%d", ReadBuffer[i]);
}
}

//scanf("%d", &flag);
while(1);
*/
HRESULT hr;
HINSTANCE hInstance = GetModuleHandle(NULL) ;//获取实例句柄;

//建立DirectInput接口
if(NULL == m_lpDI)
{
hr = DirectInput8Create(hInstance,
DIRECTINPUT_VERSION,
IID_IDirectInput8,
(void**)&m_lpDI, //接口取值
NULL);

hr = m_lpDI->EnumDevices(DI8DEVCLASS_GAMECTRL,
(LPDIENUMDEVICESCALLBACK)DIEnumDevicesCallback, //回调函数
&myGuid, //赋值GUID
DIEDFL_ATTACHEDONLY); //扫描安装好的和连接好的设备

}
/**************************************************/
//将有关该设备的标识显示出来
printf("供应商ID :0X%04X ",Attributes.VendorID);
printf("产品ID :0X%04X ",Attributes.ProductID);
printf("产品版本号:0X%04X ",Attributes.VersionNumber);

WCHAR mString[256];
TCHAR Buffer[256];

HidD_GetManufacturerString(hDeviceHandle,mString,sizeof(mString));
if (wcstombs((char *)Buffer,mString,256) == -1) // fail
{
Buffer[0] = NULL;
}
printf("生产商: %s ",Buffer);

HidD_GetProductString(hDeviceHandle,mString,sizeof(mString));
if (wcstombs((char *)Buffer,mString,256) == -1)
{
Buffer[0] = NULL;
}
printf("产品名称: %s ",Buffer);

// 通信:
PHIDP_PREPARSED_DATA pHidpPreparsedData;
HIDP_CAPS hidPCaps;
if (!HidD_GetPreparsedData(hDeviceHandle, &pHidpPreparsedData))
{
printf("获取 HID PREPARED DATA 失败!
");
return 0;
}
NTSTATUS status = HidP_GetCaps(pHidpPreparsedData,&hidPCaps);
if (status == HIDP_STATUS_SUCCESS)
{
printf("CAP信息如下:
");
printf(" InputReportByteLength %d ", hidPCaps.InputReportByteLength);
printf(" OutputReportByteLength %d ", hidPCaps.OutputReportByteLength);
}

DWORD nReadBytes = 0;
BYTE *pInputReport = new BYTE[hidPCaps.InputReportByteLength];
memset(pInputReport,0,hidPCaps.InputReportByteLength);

do
{
ReadFile(hDeviceHandle,
pInputReport,
hidPCaps.InputReportByteLength,
&nReadBytes,
NULL);

if (hidPCaps.InputReportByteLength == nReadBytes)
{
for (unsigned int i = 0; i< nReadBytes - 1;i++)
{
printf("%02x-",pInputReport[i]);
}
printf("%02x ",pInputReport[nReadBytes-1]);
}
// if (pInputReport[nReadBytes-2] == 0x20) //break the loop when pressing a specific key
{
// printf("
");
break;
}
Sleep(10);
}while (hidPCaps.InputReportByteLength == nReadBytes);

// 释放句柄资源
CloseHandle(hDeviceHandle);
}

MemberIndex++;
}while(bSuccess);
SetupDiDestroyDeviceInfoList(hDevInfo);

return 0;
}

关于如何确定哪些USB设备已连接到计算机上,可以根据以下步骤来操作:

第一、在电脑桌面上找到“我的电脑”图标,右击选择“属性”按钮,如下图所示:

第二、打开系统页面之后,选择“控制面板主页”按钮;如上图所示:

第三、打开电脑的控制面板,选择“硬件和声音”选项,点击进去;如下图所示:

第四、页面右上角显示“设备5”,USB在本电脑连接了总共5个设备;你还可以选择“添加设备”按钮来添加新的设备。



您好,WM。您是否经常观看大量电视节目,而不像我们脚本专家一样,在业余时间阅读 Shakespeare 的著作、解答微分方程式或进行其他趋向于开发智力的活动?不过,正如有人曾经告诉过我们的那样,每当电视节目中出现危急关头时,一个主要人物就会抓起一个手提式扩音器大喊,试图让人群平静下来。“保持安静!”此人对人群大喊道。“没有必要惊慌。一切都很正常。”许多时候,我们脚本专家也希望自己能有一个扩音器,而这里就有一个。您能确定哪些 USB 设备已连接到计算机上吗?是的,尽管看到“如何”时您可能开始有点儿惊慌,但您必须去解决这个问题。保持镇静。没有必要惊慌。 您说的没错:我们应该去演自己的电视剧,不是吗? 我们在此面临的问题是没有专用于 USB 设备的动态类:您不能像使用 Win32_Services 返回计算机上所有服务的集合一样,来返回 USB 设备的集合。您必须使用 WMI 关联类 (Win32_USBControllerDevice),将 USB 控制器与 USB 设备相关联。使用该信息,您可以识别关联中的相关实体(恰好就是与 USB 控制器关联的设备),然后可以查询 Win32_PNPEntity 以获得有关设备自身的信息。(遗憾的是,Win32_USBControllerDevice 除了返回有点儿模糊不清的设备 ID 之外,不会返回有关设备的任何其他信息。) 感到困惑不解吗?别沮丧;我们还不完全确定我们已经理解它。那么,咱们商量一下吧:我们将脚本展示给您,然后您可以自己决定是否需要解释此脚本的工作原理:strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colDevices = objWMIService.ExecQuery _ ("Select * From Win32_USBControllerDevice") For Each objDevice in colDevices strDeviceName = objDevice.Dependent strQuotes = Chr(34) strDeviceName = Replace(strDeviceName, strQuotes, "") arrDeviceNames = Split(strDeviceName, "=") strDeviceName = arrDeviceNames(1) Set colUSBDevices = objWMIService.ExecQuery _ ("Select * From Win32_PnPEntity Where DeviceID = ‘" & strDeviceName & "‘") For Each objUSBDevice in colUSBDevices Wscript.Echo objUSBDevice.Description Next Next 噢,很好,您仍然与我们的意见一致。正如您看到的,此脚本首先对 Win32_USBControllerDevice 进行了查询;此操作返回了所有 USB 控制器以及当前与它们相关联的设备的集合。这是个好消息。但还有一个坏消息:我们需要隔离集合中各个项的相应实体,即一个表示 USB 设备的实体。为什么这是个坏消息呢?之所以这么说,是因为相应的属性值可能看起来与以下内容类似:\\TOMSERVO\root\cimv2:Win32_PnPEntity.DeviceID="USB\\VID_045E&PID_0029\\5&236EE205&0&2" 讨厌!我们需要执行的操作就是以某种方式隔离实际的设备 ID;在此例中为“USB\\VID_045E&PID_0029\\5&236EE205&0&2”。当我们获得该值后,就可以查询 Win32_PNPEntity 类以获取有关该设备的信息。 那么我们如何隔离设备 ID 呢?哦,大概有无数种方法可以实现此目的;我们选择一种我们认为比较容易的方法来操作吧。(此方法将给您提供一些关于其他方法是什么样子的提示。)首先,我们将相应属性的值存储在一个名为 strDeviceName 的变量中。然后,我们使用 VBScript Replace 函数将双引号 – 我们使用 Chr(34) 表示双引号 – 从字符串中删除。这样将得到与以下类似的值:\\TOMSERVO\root\cimv2:Win32_PnPEntity.DeviceID=USB\\VID_045E&PID_0029\\5&236EE205&0&2 信不信由您,删除这些双引号后就基本上大功告成了。如果仔细地检查其余的值,您将注意到它们基本上分为两个部分,这两个部分被一个等号分隔开了。等号的左边是类和属性的 WMI 路径,等号的右边是设备 ID。这和我们有什么关系呢?现在我们可以使用 VBScript Split 函数来拆分等号上的值,然后创建由两个项组成的数组。第 1 项将是 WMI 路径,第 2 项将是 – 答对了! – 设备 ID。这两行代码创建数组,然后将数组中第 2 项的值(设备 ID)分配给变量 strDeviceName:arrDeviceNames = Split(strDeviceName, "=") strDeviceName = arrDeviceNames(1) 现在我们就得到了连接到计算机的第一个 USB 设备的设备 ID。有了设备 ID,我们就可以查询 Win32_PNPEntity 类以获得有关分配了设备 ID 的 USB 设备的信息。这就是下面的代码执行的操作:Set colUSBDevices = objWMIService.ExecQuery _ ("Select * From Win32_PnPEntity Where DeviceID = ‘" & strDeviceName & "‘") 这个查询将返回有关实际设备自身的信息。在此脚本中,尽管很容易回显所有在 Win32_PNPEntity 类中找到的属性的值,但我们只回显了每个设备的 Description 属性的值。然后,为 Win32_USBControllerDevice 集合中的各个项循环并重复此过程。运行此脚本时,我们将获得与以下类似的信息(当然,这取决于当前与计算机相连的设备):USB Root Hub Microsoft USB IntelliMouse Web Microsoft USB IntelliMouse Web USB Mass Storage Device Disk drive Generic volume USB Root Hub USB Root Hub 此脚本并不完美;USB 大容量存储设备、磁盘驱动器和通用卷均指同一个 USB keychain 驱动器。但至少它可以让您大概了解哪些设备连接到了(或没有连接到)计算机上。就像我们刚才所说的:没有必要惊慌。一切都很正常。

当电脑的usb借口检测到外部设备时会有一个检测过程,检测过程中会安装这个usb设备的驱动,在电脑的右下角出来提示。


鄂托克前旗19577019235: 怎么确定哪些 USB 设备已连接到计算机上 -
系炭萘普: 第一、在电脑桌面上找到“我的电脑”图标,右击选择“属性”按钮 第二、打开系统页面之后,选择“控制面板主页”按钮 第三、打开电脑的控制面板,选择“硬件和声音”选项,点击进去 第四、页面右上角显示“设备5”,USB在本电脑连接了总共5个设备;你还可以选择“添加设备”按钮来添加新的设备.

鄂托克前旗19577019235: 如何确定哪些 USB 设备已连接到计算机上?
系炭萘普: 您好,WM.您是否经常观看大量电视节目,而不像我们脚本专家一样,在业余时间阅读 Shakespeare 的著作、解答微分方程式或进行其他趋向于开发智力的活动?不过,正如有人曾经告诉过我们的那样,每当电视节目中出现危急关头时,一个...

鄂托克前旗19577019235: 怎么看有哪些设备连接到了自己的电脑开的WiFi热点上? -
系炭萘普: 手机开wifi热点,台式电脑的步骤: 1、在手机上找到移动数据并打开,并用usb线连接电脑. 2、在手机上选择usb调试模式. 3、进入手机的设置——更多设置——wifi热点,把usb共享网络打开. 4、直接在电脑上打开网页或软件,用电脑通过手机流量上网.提示:电脑上的其它软件比较费流量,请把不用的软件关掉.

鄂托克前旗19577019235: 如何检测哪些串口已经连接 -
系炭萘普: 挨个打开串口1到N,判断返回的结果,结果无非是 1.有,未用 2.有,已用 3.无 至于你说的插入新设备检测,可以通过读系统文件中的串口设置来解决,即程序运行后即检测一次并保存结果,然后按一定时间间隔再检测

鄂托克前旗19577019235: 手机otg有没有快捷键 - 如何使用手机OTG功能
系炭萘普: 1. 如何使用手机OTG功能首先需要准备otg线和U盘,将otg线的一端插入手机的USB接口,再将另一端与U盘连接.然后在手机里打开应用管理,如果在应用管理中显示有...

鄂托克前旗19577019235: 苹果usb设置在哪里 - 苹果usb在哪儿设置
系炭萘普: 苹果usb在哪儿设置需要下载i-usb-storer软件进行安装设置,即可连接U盘.具体步骤如下:1.点击前往APP Store下载i-usb-storer软件安装;2.打开i-usb-storer后,进入界...

鄂托克前旗19577019235: 如何通过枚举设备来判断我的USB已经处在连接状态 -
系炭萘普: 您好,一旦获悉有新设备连接上来,主机就会发送一系列的请求(Resqusts)给设备所挂载到的hub,再由hub建立起一条连接主机(Host)和设备(Device)之间的通信通道.然后主机以控制传输(ControlTransfer)的方式,通过端点0(...

鄂托克前旗19577019235: 华为荣耀手机看u盘视频怎么设置
系炭萘普: 方法如下:1.首先在连接U盘前需要对手机进行设置,以便手机识别U盘设备,打开手... 此时手机会提示【USB存储设备已连接】,点击该提示.4.手机会自动跳转到文件管...

鄂托克前旗19577019235: 这个BIOS项是什么意思?USBwakeupfromS3USB
系炭萘普: s3待机模式:在这种状态下,计算机看起来已经关闭,仅使用最少的电力来维持内存中的数据,其他设备都被关闭.这个选项是用来设置是否使用USB设备唤醒已经睡眠而处于待机状态没有关机的计算机,一般设置为disable,不启用即可.可直接按电源开关唤醒计算机,笔记本打开显示屏自动唤醒计算机.

鄂托克前旗19577019235: 如何查看USB方式连接Android设备的外接设备信息 -
系炭萘普: 1,链接USB设备到电脑 2.在连接Android设备的选项中打开开发人员选项,比如:Android手机在系统设置-最下面的开发人员选项,部分手机被隐藏了. 3.在电脑上用软件就可以完全控制手机了,比如360手机助手就可以查看手机全部信息

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网