如何在一个服务中插入USB磁盘驱动器并删除事件,而不会在某些操作系统上重复访问我的硬盘驱动器?
问题描述:
我用我的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查询会给我没有声音效果的事件?
答
不确定这是否适用于您的案例,但我们一直在我们的C#代码中使用RegisterDeviceNotification(我不能在这里发布)来检测USB设备何时插入。您需要一些本机功能进口但通常运作良好。最简单的做法是先用C++工作,然后看看你有什么需要转入C#。
有上koders代码搜索一些东西,似乎是整个C#设备管理模块,可以帮助:
http://www.koders.com/csharp/fidEF5C6B3E2F46BE9AAFC93DB75515DEFC46DB4101.aspx
答
尝试寻找InstanceCreationEvent,这将标志着一个新的Win32_LogicalDisk实例的创建。现在你正在查询实例操作,而不是创建。您应该知道这些事件的查询时间间隔很长 - 您可以更快地检测到USB进出。
您在那里的查询不是专门查找USB设备,而是安装新磁盘,因此在格式化硬盘时可能会触发,而不是在插入非基于磁盘的USB设备(如鼠标)时触发。 – DamienG 2008-09-20 00:29:58
谢谢,编辑指定我真正想要的 - USB磁盘驱动器插入和删除事件。我添加了“DriveType = 2”(指定可移动磁盘),希望能消除硬盘驱动器的声音,但没有运气。 – Wonko 2008-10-01 02:42:05