WMI和Win32_DeviceChangeEvent - 返回了错误的事件类型?

时间:2008-09-02 14:48:29

标签: event-handling wmi

我正在尝试使用WMI注册到“已添加设备/已删除设备”事件。当我说设备时 - 我的意思是Disk-On-Key或任何其他有文件的设备,我可以访问...

我正在注册活动,并且活动已经提出,但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;
    }
}

4 个答案:

答案 0 :(得分:1)

好吧,我找不到代码。试过我的旧RAC帐户,什么都没有。我的旧备份中没有任何内容。去搞清楚。但是我试着弄清楚我是怎么做到的,而且我认为这是正确的顺序(我在article上有很多基础):

  1. 获取所有驱动器号和缓存 他们。
  2. 等待WM_DEVICECHANGE 消息,并启动一个计时器 超时1秒(这是完成的 避免大量的虚假 WM_DEVICECHANGE消息开始 插入后立即开始 USB密钥/其他设备,只有结束 当驱动器“安顿好”时)。
  3. 比较驱动器号和 旧缓存并检测新缓存。
  4. 获取这些设备信息。
  5. 我知道还有其他方法,但事实证明这是唯一可以在不同版本的Windows中一致工作的方法,我们需要这样,因为我的客户端在从任何类型的设备上传图像的网页上使用ActiveX控件你插入(我认为他们生产了某种印刷亭)。

答案 1 :(得分:0)

哦!是的,我已经完成了这一步,但是在不久前使用原始Windows API调用,同时开发了一个检测到任何类型媒体插入的ActiveX控件。我会尝试从我的备份中发现代码,看看我是否可以告诉你我是如何解决它的。我会订阅RSS,以防有人先到达那里。

答案 2 :(得分:0)

那么,

你可以尝试win32_logical磁盘类并将其绑定到__Instancecreationevent。 您可以轻松获得所需信息

答案 3 :(得分:0)

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