WMI和Win32_DeviceChangeEvent-返回错误的事件类型?
时间:2020-03-05 18:46:29 来源:igfitidea点击:
我正在尝试使用WMI注册到"添加设备/删除设备"事件。当我说设备时,我指的是磁盘上的密钥或者任何其他我可以访问的文件的设备。
我正在注册该事件,并且引发了该事件,但是EventType属性与我期望看到的有所不同。
文档(MSDN)指出:1更改配置,2添加设备,3删除设备4对接。由于某种原因,我总是得到1的值。
有任何想法吗 ?
这是示例代码:
public class WMIReceiveEvent { public WMIReceiveEvent() { try { WqlEventQuery query = new WqlEventQuery( "SELECT * FROM Win32_DeviceChangeEvent"); ManagementEventWatcher watcher = new ManagementEventWatcher(query); Console.WriteLine("Waiting for an event..."); watcher.EventArrived += new EventArrivedEventHandler( HandleEvent); // Start listening for events watcher.Start(); // Do something while waiting for events System.Threading.Thread.Sleep(10000); // Stop listening for events watcher.Stop(); return; } catch(ManagementException err) { MessageBox.Show("An error occurred while trying to receive an event: " + err.Message); } } private void HandleEvent(object sender, EventArrivedEventArgs e) { Console.WriteLine(e.NewEvent.GetPropertyValue["EventType"]); } public static void Main() { WMIReceiveEvent receiveEvent = new WMIReceiveEvent(); return; } }
解决方案
回答
哦!是的,我已经经历过了,但是前一段时间使用原始Windows API调用,同时开发了可检测到任何媒体插入的ActiveX控件。我将尝试从备份中挖掘代码,看看是否可以告诉我们如何解决它。我会订阅RSS,以防万一有人先到达那里。
回答
好吧,我找不到代码。在我的旧RAC帐户上尝试过,没什么。我的旧备份一无所有。去搞清楚。但是我试图弄清楚我是如何做到的,而且我认为这是正确的顺序(我在本文中基于很多内容):
- 获取所有驱动器号并缓存它们。
- 等待WM_DEVICECHANGE消息,并以1秒钟的超时时间启动计时器(这样做是为了避免许多虚假的WM_DEVICECHANGE消息在插入USB密钥/其他设备后立即开始,并且仅在驱动器处于"已解决")。
- 将驱动器号与旧的缓存进行比较,然后检测新的。
- 获取有关这些设备的信息。
我知道还有其他方法,但是事实证明,这是唯一可以在不同版本的Windows中保持一致的方法,并且我们需要这样,因为我的客户端在网页上使用ActiveX控件,该控件可以从我们插入的任何类型的设备上传图像(我认为他们制作了某种打印亭)。
回答
出色地,
我们可以尝试使用win32_logical磁盘类并将其绑定到__Instancecreationevent。
我们可以轻松获取所需的信息
回答
我在系统上进行了尝试,最终得到了正确的代码。这只需要一段时间。我收到了十几个事件,其中一个是设备连接代码。