据我所见,这是正常的。我在这里遇到了完全相同的问题。
您可以做两件事 - 为 DateTime.Now 设置一个 var,然后检查下一个到达时间,看看到达时间之间的时间差是否距上次发生事件的时间小于 x 秒(基本上存储您上次到达的时间)处理到达)
or
您可以存储驱动器列表,如果事件处理与您已有的设备相同的设备,则可以忽略它。
但是,是的,因为 USB 设备通常将自己作为多个设备呈现给系统,所以它往往会发送多个设备插入。
我用来解决这个问题的另一件事是使用 WMI 的事件,通过观察程序来检测逻辑存储事件(__InstanceCreation ,目标为 Win32_LogicalDisk)
private void startMonitor()
{
while (serviceStarted)
{
ManagementEventWatcher watcher = new ManagementEventWatcher();
WqlEventQuery query = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_LogicalDisk'");
watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
watcher.Query = query;
watcher.Start();
watcher.WaitForNextEvent();
}
Thread.CurrentThread.Abort();
}
使用 EventArrived 处理程序...
private void watcher_EventArrived(object obj, EventArrivedEventArgs e)
{
var newEvent = e.NewEvent;
ManagementBaseObject targetInstance = (ManagementBaseObject)newEvent.GetPropertyValue("TargetInstance");
string drivename = targetInstance.GetPropertyValue("Name").ToString();
Drivename 最终实际上是驱动器号,例如 D: 或其他...
缺点是应用程序需要以本地 WMI 范围的正确权限运行,并且比被动处理窗口消息稍微密集一些。