Я писал код, который обнаруживает добавление и удаление 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 *из Win32_PnPEntity "или какой-либо другой подобный запрос.НО, это очень неточный и громоздкий способ идентификации устройства, которое было удалено.Проблема в том, что я не могу точно сказать, какое устройство было добавлено, если я не кеширую весь список Win32_PnPEntity заранее и не выполняю действительно сумасшедшие сравнения / проверки.
Я что-то упускаю здесь из виду?Как связать события смены устройства с конкретным устройством?
ОБНОВЛЕНИЕ: я до сих пор не нашел идеального решения этой проблемы, но я делаю, ведя список подключенных в настоящее время устройств (что меня интересует) в памяти, и каждый раз, когда происходит обработка события (см. выше), я запрашиваю Win32_PnPEntity, чтобы проверить, все ли подключенные устройства, которые я сохранил в списке подключенных устройств, все еще подключены.Это неоптимальное решение, потому что кажется странным, что я не могу получить какую-либо конкретную идентификационную информацию устройства из события, которое указывает «событие изменения устройства».ОЧЕНЬ странно, что эта информация недоступна. Вздох