【发布时间】:2010-06-16 07:34:29
【问题描述】:
如何以编程方式获取用户刚刚插入的 USB 大容量存储设备的设备实例 ID(唯一 ID)?
【问题讨论】:
标签: c# winapi wmi windows-scripting device-instance-id
如何以编程方式获取用户刚刚插入的 USB 大容量存储设备的设备实例 ID(唯一 ID)?
【问题讨论】:
标签: c# winapi wmi windows-scripting device-instance-id
通过注册设备更改通知,从任何窗口句柄中捕获 WM_DEVICECHANGE。因此:
DEV_BROADCAST_DEVICEINTERFACE dbd = { sizeof(dbd) };
dbd.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
dbd.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE;
RegisterDeviceNotification(hwnd, &dbd, DEVICE_NOTIFY_WINDOW_HANDLE);
WM_DEVICECHANGE 的 lParam 可以转换为 DBT_DEVTYP_DEVICEINTERFACE。注意 - 插入设备时,您可能会收到多个 WM_DEVICECHANGE 通知。只需过滤到达事件并忽略重复项。
LRESULT WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(hwnd)
{
case WM_DEVICE_CHANGE:
{
PDEV_BROADCAST_HDR pHdr = NULL;
PDEV_BROADCAST_DEVICEINTERFACE pDev = NULL;
pHdr = (PDEV_BROADCAST_HDR)lParam;
bool fDeviceArrival = (wParam == DBT_DEVICEARRIVAL);
if (fDeviceArrival)
{
if (pHdr && (pHdr->dbch_devicetype==DBT_DEVTYP_DEVICEINTERFACE))
{
pDev = (PDEV_BROADCAST_DEVICEINTERFACE)lParam;
}
if (pDev && (pDev->dbcc_classguid == GUID_DEVINTERFACE_USB_DEVICE))
{
// the PNP string of the device just plugged is in dbcc_name
OutputDebugString(pDev->dbcc_name);
OutputDebugString("\r\n");
}
}
....
【讨论】:
lParam of WM_DEVICECHANGE,可能会或可能不会转换为 DBT_DEVTYP_DEVICEINTERFACE。这取决于wParam。例如。如果 wparam 是 DBT_DEVICEARRIVAL 或 DBT_DEVICEREMOVECOMPLETE,则可以强制转换,但如果是 DBT_DEVNODES_CHANGED,则不能。对于DBT_DEVNODES_CHANGED 的情况,lParam 始终为zero。
我认为您可以使用 WMI 做到这一点。查看Win32_LogicalDiskToPartition 类以获取所有磁盘名称的列表,然后使用这些名称查询Win32_DiskDrive 类,它是PNPDeviceID 属性。
实际上,请查看here 以获得更好的说明和为您做的漂亮课程。
【讨论】:
ManagementEventWatcher 类和“DiskEventArrived”事件。此代码应向您显示结构:eggheadcafe.com/software/aspnet/31850441/…