【问题标题】:WMI and Win32_DeviceChangeEvent - Wrong event type returned?WMI 和 Win32_DeviceChangeEvent - 返回错误的事件类型?
【发布时间】:2008-09-02 14:48:28
【问题描述】:

我正在尝试使用 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;
    }
}

【问题讨论】:

    标签: event-handling wmi


    【解决方案1】:

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

    1. 获取所有驱动器号和缓存 他们。
    2. 等待 WM_DEVICECHANGE 消息,并启动一个计时器 超时 1 秒(这样做是为了 避免大量虚假 WM_DEVICECHANGE 消息开始 插入后立即开始 USB 密钥/其他设备,仅结束 当驱动器“稳定”时)。
    3. 将驱动器号与 旧缓存并检测新缓存。
    4. 获取这些设备的信息。

    我知道还有其他方法,但事实证明这是唯一一种可以在不同版本的 Windows 中始终如一地工作的方法,我们需要它,因为我的客户端在从任何类型的设备上传图像的网页上使用 ActiveX 控件你插入了(我认为他们生产了某种打印亭)。

    【讨论】:

      【解决方案2】:

      哦!是的,我已经经历过,但前段时间使用原始 Windows API 调用,同时开发一个检测任何类型媒体插入的 ActiveX 控件。我会尝试从我的备份中挖掘代码,看看我是否能告诉你我是如何解决它的。我会订阅 RSS 以防万一有人先到。

      【讨论】:

        【解决方案3】:

        嗯,

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-04-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多