2012-02-12 59 views
17

我想要檢測何時將SD(或其他卡)插入讀卡器。我知道WM_DEVICECHANGE,但我需要獲取指定驅動器號的特定設備類型信息。例如,我想區分讀卡器中的任何卡和「普通」閃存驅動器。 GetDriveType()似乎不夠精緻。我的其他選擇是什麼?從驅動器號獲取特定設備類型

我很滿意Windows 7解決方案。我不需要向後兼容。

這種類型的改進可能都是?

我找到了this topic這不能提供滿意的答案。 This one感覺就像要走的路,但沒有示例代碼或指向示例代碼的指針。令人難以置信的是,沒有人爲此類共同請求拼湊出一個工作樣本。

[編輯]

我也found this。提供的示例有一些錯誤,但修復後,我仍然沒有結果。對於插入SD卡的設備,我得到一個BusTypeUnknown而不是BusTypeSdpDeviceDesc.BusType。這看起來簡單直接,但仍然失敗。

+1

您是否嘗試過WMI? Win32_LogicalDrive和Win32_PhysicalMedia看起來很有前途。在編寫任何代碼之前先使用WMI Code Creator實用程序。 – 2012-02-12 14:00:56

+0

不,我以前只有WMI頭疼過。我儘量避免它。 WMI會在Windows服務中工作嗎? – wpfwannabe 2012-02-12 14:23:22

+0

嗨,你有沒有得到這個問題的答案?我也需要這樣做 – 2012-08-12 21:14:58

回答

0

我不認爲這是可能的,因爲讀卡器以與常規閃存驅動器相同的方式展示其存儲。他們都是USB海量存儲類設備。這是此設備類上的Wikipedia article。操作系統無法區分這兩種設備類型。

1

這看起來有用:How Can I Determine Which USB Devices are Connected to a Computer?

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」這樣的搜索術語。

相關問題