2010-03-10 82 views
5

我正在使用WM_DEVICECHANGE在新的USB驅動器連接到計算機時收到通知。這對拇指驅動器等設備非常有用,只要設備到達,就可以從中讀取文件。對於像SD卡讀卡器這樣的設備來說,它並不是因爲當設備連接時發送一次消息,而是當用戶實際將卡插入設備時不發送消息。使用Windows消息檢測介質插入驅動器

是否可以檢測新介質插入到現有USB設備而不必使用輪詢?

+0

檢查此問題http://stackoverflow.com/questions/583593/how-can-i-detect-when-an-sd-card-is-plugged-in – 2010-03-10 20:09:57

+2

@Kirill:有一個很好的理由,這個問題有沒有接受的答案。他們無法區分「新驅動器」和「在現有驅動器中插入卷」。 – MSalters 2010-03-11 10:35:41

回答

8

我剛剛在幾周前做過這個。從技術上講,RegisterDeviceNotification路線是正確的路線,但它需要大量的工作才能正確實施。但是,Windows資源管理器已經爲您完成了所有艱苦的工作。只需使用SHChangeNotifyRegister與SHCNE_DRIVEADD/SHCNE_DRIVEREMOVED/SHCNE_MEDIAINSERTED/SHCNE_MEDIAREMOVED。請注意,此方法取決於Shell硬件檢測服務(或任何它所稱的服務),但它比嘗試自己重新實現功能要容易得多。

+0

呼叫良好。實現該功能的庫存在於每個系統上。但是DisableAutorunDriveType註冊表設置會影響到這一點嗎? – 2010-03-11 14:45:06

+0

我沒有測試過,但我不認爲兩者是連接的。此機制由「安全移除硬件」托盤應用程序使用;即使自動運行被禁用,該托盤應用程序仍然需要接收到達/刪除通知。 – Luke 2010-03-11 17:44:04

+3

即使DriveTypeAutoRun註冊表設置設置爲禁用所有設備,也會發送SHCNE_MEDIAINSERTED消息。 – rjschnorenberg 2010-03-11 19:26:46

0

可能是SD閱讀器驅動程序中的一個錯誤。 WM_DEVICECHANGE中的說明是「DBT_DEVICEARRIVAL 0x8000設備或介質已插入,現在可用。」

因此,你應該得到一個媒體插入通知。

您是否嘗試過使用RegisterDeviceNotification?默認情況下僅發送一些通知,而媒體更改可能不是其中的一個。

+0

恰巧,默認情況下會發送新的卷通知。 – MSalters 2010-03-11 10:36:56

+0

正確,但驅動器號(音量)是在插入讀卡器時分配的。媒體更改通知可能需要RegisterDeviceNotification。 – 2010-03-11 14:42:15

0

也許這是設備驅動程序中的錯誤(我當然認爲是這樣),但它們似乎都以相同的方式工作......不是。所以在這一點上,我認爲即使微軟(可能是最大的開發者)讓你相信它應該以這種方式工作(不適用於我的Windows7微軟驅動程序),你也不會得到任何設備驅動開發人員來改變他們的設備特性。將SD卡插入USB設備根本不會觸發WM_DEVICECHANGE消息。

對媒體類型設備使用SHChangeNotifyRegister。它不需要註冊devicenotification。您可以通過SHGetPathFromIDList獲取驅動器號。使用SHCNE_MEDIAINSERTED和SHCNE_MEDIAREMOVED。

如果您正在尋找硬件設備而不是媒體設備,或者您可能能夠編寫自己的設備驅動程序,請使用設備ONDeviceNotify。

看到這個評論的代碼CodeProject - Trapping windows messages

2

還有就是SHChangeNotifyRegister在「更改通知守望樣本」使用的一個很好的例子。 從這個地址下載:

http://msdn.microsoft.com/en-us/library/dd940348.aspx#downloading

我在Qt代碼實現SHChangeNotifyRegister。

感謝盧克的非常好的答案!

+0

我很新 - 當涉及到混合和實現Windows代碼(像SHChangeNotifyRegister東西)與Qt代碼。你能給我一些指導如何繼續這個?任何幫助表示讚賞! – zeFree 2013-03-16 14:22:40

相關問題