Использование WMI для определения того, какое устройство вызвало событие Win32_DeviceChangeEvent

Я писал код, который обнаруживает добавление и удаление USB-устройств, и использовал следующий код WMI для регистрации уведомлений об изменении устройства :

watcher = new ManagementEventWatcher(query);
watcher.EventArrived += new EventArrivedEventHandler(DeviceChangeEventReceived);
watcher.Start();

Это код обработчика:

void DeviceChangeEventReceived(object sender, EventArrivedEventArgs e)
{
   foreach (PropertyData pd in e.NewEvent.Properties)
   {
      Log.Debug("\t" + pd.Name + ":" + pd.Value + "\t" + pd.Value.GetType());
   }
}

Это здорово, и все, оно работает с любым USB-устройством, которое я подключаю или удаляю из системы. Проблема, с которой я столкнулся, заключается в том, как определить устройство, вызвавшее события?

В другом месте моей программы я веду список подключенных в данный момент устройств, которые меня больше всего интересуют, поэтому, если происходит событие об удалении устройства, я могу проверить этот список по WMI, используя «select * from Win32_PnPEntity» или другой аналогичный запрос. НО, это очень неточный и громоздкий способ определения удаленного устройства. Дополнительная проблема заключается в том, что у меня нет возможности точно сказать, какое устройство было добавлено, если я не кэширую весь список Win32_PnPEntity заранее и не провожу действительно сумасшедшие сравнения / проверки.

Я упустил что-то очевидное? Как мне связать события изменения устройства с конкретным устройством?

ОБНОВЛЕНИЕ: Я до сих пор не нашел идеального решения этой проблемы, но то, что я делаю, - это ведение списка подключенных в данный момент устройств (это я ' m) в памяти, и каждый раз, когда событие обрабатывается (см. выше), Я запрашиваю Win32_PnPEntity, чтобы узнать, подключены ли все еще устройства, которые я сохранил в моем списке подключенных устройств. Это неоптимальное решение, потому что кажется странным, что я не могу получить какую-либо конкретную идентификационную информацию устройства из события, которое указывает на «событие смены устройства». Кажется ОЧЕНЬ странным, что эта информация недоступна. вздох

10
задан warriorpostman 15 March 2011 в 18:06
поделиться