WMI事件Win32_VolumeChangeEvent在Windows XP上工作
问题描述:
我试图使用以下c#代码来检测附加/移除的事件 usb大容量存储设备。我正在使用Win32_VolumeChangeEvent。WMI事件Win32_VolumeChangeEvent在Windows XP上工作
// 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上工作?
答
正如你可以在自己的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开发;-) – 2015-09-22 08:47:34