3

我在我的 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 查询会给我没有声音效果的事件?

4

3 回答 3

2

不确定这是否适用于您的情况,但我们一直在 C# 代码中使用 RegisterDeviceNotification(我无法在此处发布)来检测 USB 设备何时插入。您必须导入一些本机函数,但通常效果很好。最容易让它在 C++ 中工作,然后看看你必须升级到 C#。

koders 代码搜索中有一些东西似乎是一个完整的 C# 设备管理模块,可能会有所帮助:

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

于 2008-09-20T02:03:20.913 回答
1

尝试查找 InstanceCreationEvent,这将表明创建了一个新的 Win32_LogicalDisk 实例。现在您正在查询实例操作,而不是创建。您应该知道这些事件的查询间隔非常长 - 可以更快地插入和取出 USB,您会检测到。

于 2008-11-30T16:04:22.323 回答
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();
    }
}
}
于 2018-10-02T20:13:53.137 回答