4

I am trying to register to a "Device added/ Device removed" event using WMI. When I say device - I mean something in the lines of a Disk-On-Key or any other device that has files on it which I can access...

I am registering to the event, and the event is raised, but the EventType propery is different from the one I am expecting to see.

The documentation (MSDN) states : 1- config change, 2- Device added, 3-Device removed 4- Docking. For some reason I always get a value of 1.

Any ideas ?

Here's sample code :

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

4 回答 4

1

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

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

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

于 2008-09-15T11:24:13.643 回答
0

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

于 2008-09-02T21:21:38.593 回答
0

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

于 2010-03-08T02:38:50.827 回答
0

出色地,

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

于 2009-07-13T16:07:06.127 回答