我在Windows服务中使用此代码来通知插入和删除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 :(得分:2)
不确定这是否适用于您的情况,但我们一直在我们的C#代码中使用RegisterDeviceNotification(我无法在此处发布)来检测何时插入USB设备。您必须导入一些本机功能但它通常运作良好。最容易使它在C ++中工作,然后看看你有什么要升级到C#。
koders上的一些东西代码搜索似乎是一个可能有帮助的整个C#设备管理模块:
http://www.koders.com/csharp/fidEF5C6B3E2F46BE9AAFC93DB75515DEFC46DB4101.aspx
答案 1 :(得分:1)
尝试查找InstanceCreationEvent,它将发出新Win32_LogicalDisk实例的信号。现在你正在查询实例操作,而不是创作。您应该知道这些事件的查询间隔时间很长 - 可以更快地弹出USB进入和发送。
答案 2 :(得分:1)
尝试
using System;
using System.Management;
namespace MonitorDrives
{
class Program
{
public enum EventType
{
Inserted = 2,
Removed = 3
}
static void Main(string[] args)
{
ManagementEventWatcher watcher = new ManagementEventWatcher();
WqlEventQuery query = new WqlEventQuery("SELECT * FROM Win32_VolumeChangeEvent WHERE EventType = 2 or EventType = 3");
watcher.EventArrived += (s, e) =>
{
string driveName = e.NewEvent.Properties["DriveName"].Value.ToString();
EventType eventType = (EventType)(Convert.ToInt16(e.NewEvent.Properties["EventType"].Value));
string eventName = Enum.GetName(typeof(EventType), eventType);
Console.WriteLine("{0}: {1} {2}", DateTime.Now, driveName, eventName);
};
watcher.Query = query;
watcher.Start();
Console.ReadKey();
}
}
}