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。
我们可以轻松获取所需的信息

回答

我在系统上进行了尝试,最终得到了正确的代码。这只需要一段时间。我收到了十几个事件,其中一个是设备连接代码。