2008-09-20 43 views
2

我用我的Windows服務的代碼通知USB磁盤驅動器的插入和刪除:如何在一個服務中插入USB磁盤驅動器並刪除事件,而不會在某些操作系統上重複訪問我的硬盤驅動器?

WqlEventQuery query = new WqlEventQuery("__InstanceOperationEvent", 
    "TargetInstance ISA 'Win32_LogicalDisk' AND TargetInstance.DriveType=2"); 
query.WithinInterval = TimeSpan.FromSeconds(1); 
_deviceWatcher = new ManagementEventWatcher(query); 
_deviceWatcher.EventArrived += new EventArrivedEventHandler(OnDeviceEventArrived); 
_deviceWatcher.Start(); 

它適用於XP和Vista,但XP,我可以聽到硬盤的非常明顯的聲音每秒訪問一次。是否有另一個WMI查詢會給我沒有聲音效果的事件?

+0

您在那裏的查詢不是專門查找USB設備,而是安裝新磁盤,因此在格式化硬盤時可能會觸發,而不是在插入非基於磁盤的USB設備(如鼠標)時觸發。 – DamienG 2008-09-20 00:29:58

+0

謝謝,編輯指定我真正想要的 - USB磁盤驅動器插入和刪除事件。我添加了「DriveType = 2」(指定可移動磁盤),希望能消除硬盤驅動器的聲音,但沒有運氣。 – Wonko 2008-10-01 02:42:05

回答

1

不確定這是否適用於您的案例,但我們一直在我們的C#代碼中使用RegisterDeviceNotification(我不能在這裏發佈)來檢測USB設備何時插入。您需要一些本機功能進口但通常運作良好。最簡單的做法是先用C++工作,然後看看你有什麼需要轉入C#。

有上koders代碼搜索一些東西,似乎是整個C#設備管理模塊,可以幫助:

http://www.koders.com/csharp/fidEF5C6B3E2F46BE9AAFC93DB75515DEFC46DB4101.aspx

1

嘗試尋找InstanceCreationEvent,這將標誌着一個新的Win32_LogicalDisk實例的創建。現在你正在查詢實例操作,而不是創建。您應該知道這些事件的查詢時間間隔很長 - 您可以更快地檢測到USB進出。

相關問題