【问题标题】:Does the WMI event Win32_VolumeChangeEvent work on Windows XPWMI 事件 Win32_VolumeChangeEvent 是否适用于 Windows XP
【发布时间】:2009-05-19 12:03:16
【问题描述】:

我正在尝试使用以下 c# 代码来检测附加/删除的事件 USB 大容量存储设备。我正在使用 Win32_VolumeChangeEvent。

  
// Initialize an event watcher and subscribe to events that match this query            
var _watcher = new ManagementEventWatcher("select * from Win32_VolumeChangeEvent");
_watcher.EventArrived += OnDeviceChanged;
_watcher.Start();

void OnDeviceChanged(object sender, EventArrivedEventArgs args)
{
    Console.WriteLine(args.NewEvent.GetText(TextFormat.Mof));
}

问题在于这在 Vista 上运行良好,但在 XP 上根本无法运行(没有收到任何事件)。 Microsoft 文档说这应该可以工作 (http://msdn.microsoft.com/en-us/library/aa394516(VS.85).aspx)。我用谷歌搜索了一段时间,发现其他也有这个问题。但我也发现了几篇文章声称这种查询(主要在 vbscript 中)适用于 XP。但是我无法从微软那里找到一些关于这个问题的官方信息,而且我不敢相信微软已经忽略了三个服务包的这个问题。

所以我的问题是:是否有人在 XP 上成功使用了 Win32_VolumeChangeEvent,或者可以提供链接/解释为什么它不应该在 XP 上工作?

【问题讨论】:

    标签: wmi usb


    【解决方案1】:

    正如您在自己的link 中看到的,Win32_VolumeChangeEvent 支持的最低客户端版本是 Windows Vista。无论如何,正如here 建议的那样,您可以在root\\CIMV2 范围内的区间内执行查询。这是我的代码中的一个示例:

    WqlEventQuery query;
    ManagementScope scope;
    ManagementEventWatcher watcher;
    public void DoWork()
    {
        // Check if OS Version is earlier than Windows Vista
        if (USBHandlerWorker.OSVersion() <= 6)
        {
            scope = new ManagementScope("root\\CIMV2");
            scope.Options.EnablePrivileges = true;
    
            query = new WqlEventQuery();
            query.EventClassName = "__InstanceCreationEvent";
            query.WithinInterval = new TimeSpan(0, 0, 1);
            query.Condition = @"TargetInstance ISA 'Win32_USBControllerdevice'";
    
            watcher = new ManagementEventWatcher(scope, query);
            watcher.EventArrived += watcher_EventArrived;
            watcher.Start();  
        }
        else
        {
            watcher = new ManagementEventWatcher();
            // The event types 2 and 3 are for plug and unplug events
            query = new WqlEventQuery("SELECT * FROM Win32_VolumeChangeEvent " +
                "WHERE EventType = 2 OR EventType = 3");
            watcher.EventArrived += watcher_EventArrived;
            watcher.Query = query;
            watcher.Start();
        }
    }
    

    【讨论】:

    • 六年前我问这个问题时,文档中没有写,但现在写了。无论如何,我希望没有人还在为 Windows XP 开发 ;-)
    【解决方案2】:

    “Win32_VolumeChangeEvent .. 只能在 Windows Server 2003 上找到”-source

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      • 2010-10-15
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多