0

当插入便携式设备并且能够这样做时,我试图捕捉该事件。我的问题是它调用了两个插入事件。

这是我的代码:

 private void DeviceInsertedEvent(object sender, EventArrivedEventArgs e)
    {
            MessageBox.Show("Device Received");
    }

private void DeviceRemovedEvent(object sender, EventArrivedEventArgs e)
{
        MessageBox.Show("Device Removed");
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    WqlEventQuery insertQuery = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 3 WHERE TargetInstance ISA 'Win32_PnPEntity'");
    ManagementEventWatcher insertWatcher = new ManagementEventWatcher(insertQuery);
    insertWatcher.EventArrived += new EventArrivedEventHandler(DeviceInsertedEvent);
    insertWatcher.Start();

    WqlEventQuery removeQuery = new WqlEventQuery("SELECT * FROM __InstanceDeletionEvent WITHIN 3 WHERE TargetInstance ISA 'Win32_PnPEntity'");
    ManagementEventWatcher removeWatcher = new ManagementEventWatcher(removeQuery);
    removeWatcher.EventArrived += new EventArrivedEventHandler(DeviceRemovedEvent);
    removeWatcher.Start();
}

当我将手机插入电脑时。发生了两起收到设备的情况。

在此处输入图像描述

我如何让它在第一个实例上停止?

4

1 回答 1

0

一个相当不干净的解决方案是这样的:

WqlEventQuery insertQuery = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 3 WHERE     TargetInstance ISA 'Win32_PnPEntity'");
ManagementEventWatcher insertWatcher = new ManagementEventWatcher(insertQuery);

EventArrivedEventHandler eventArrivedhandler = (sender, e) => { };
eventArrivedhandler = (sender, e) =>
{
    insertWatcher.EventArrived -= eventArrivedhandler;
    DeviceInsertedEvent(sender,e);
};
insertWatcher.EventArrived += eventArrivedhandler;
insertWatcher.Start();

我不能说我喜欢它,但它很可能会成功。

于 2014-06-18T08:42:59.873 回答