从驱动器字母获取特定设备类型

17

我想检测SD卡(或其他卡)插入读卡器的时刻。我知道关于WM_DEVICECHANGE,但我需要在给定驱动器号的情况下获取特定设备类型的信息。例如,我想区分读卡器中的任何卡与“普通”闪存驱动器。 GetDriveType()似乎不够精细。还有其他选择吗?

我满意Windows 7的解决方案。我不需要向后兼容。

这种精细化是否可行?

我发现这个主题没有提供令人满意的答案。这个感觉是正确的方法,但没有示例代码或指向示例代码的指针。令人难以置信的是,没有人为如此普遍的请求拼凑出一个可用的示例。

[编辑]

我也找到了这个。提供的示例有一些错误,但修复后我仍然没有结果。对于插入SD卡的设备,我在pDeviceDesc.BusType中得到BusTypeUnknown而不是BusTypeSd。这看起来很简单,但仍然失败。


1
你尝试过使用WMI吗?Win32_LogicalDrive和Win32_PhysicalMedia看起来很有前途。在编写任何代码之前,先使用WMI Code Creator实用程序。 - Hans Passant
不,我以前只是因为WMI而头痛。我尽可能避免使用它。WMI在Windows服务中能工作吗? - wpfwannabe
你好,你有得到这个问题的答案吗?我也需要做这个。 - Arsen Mkrtchyan
获取卷/磁盘类型而不使用Setup API。http://stackoverflow.com/questions/2989713/get-drive-type-with-setupdigetdeviceregistryproperty/15662619#15662619 - bkausbk
2个回答

1
这看起来很有用:如何确定计算机连接了哪些USB设备?
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

示例输出(应为树形结构):

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大容量存储设备”。如果是这样,请检查卷标或autorun.inf(如果有的话)。

由于微软是USB的发明者之一,所以你可能不需要this Linux info,但它可以用于搜索词如“Pendrive”和“Flash Drive”。


0

我认为这是不可能的,因为卡读取器将其存储以与常规闪存驱动器相同的方式呈现给操作系统。它们都是USB大容量存储类设备。这里是关于该设备类的维基百科文章。操作系统无法区分这两种设备类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接