如何在服务中插入和删除事件中的USB磁盘驱动器,而不会在某些操作系统上反复访问我的硬盘驱动器?

时间:2008-09-20 00:27:18

标签: c# wmi

我在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查询可以为我提供没有声音效果的事件?

3 个答案:

答案 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();
    }
}
}