Обнаружить вставку носителя в дисковод с помощью сообщений Windows - PullRequest
6 голосов
/ 10 марта 2010

В настоящее время я использую WM_DEVICECHANGE, чтобы получать уведомления о подключении новых USB-накопителей к компьютеру. Это прекрасно работает для таких устройств, как флэш-накопители, где, как только устройство прибывает, оно готово для чтения файлов с него. Для таких устройств, как устройства чтения карт SD, это происходит не потому, что сообщение отправляется один раз, когда устройство подключено, но сообщение не отправляется, когда пользователь фактически вставляет карту в устройство.

Можно ли обнаружить вставку нового носителя в существующее USB-устройство без необходимости опроса?

Ответы [ 4 ]

8 голосов
/ 11 марта 2010

Я только что сделал это несколько недель назад. Технически говоря, путь RegisterDeviceNotification - это правильный путь, но он требует приличного количества работы, чтобы получить права. Тем не менее, Windows Explorer уже выполняет всю тяжелую работу за вас. Просто используйте SHChangeNotifyRegister с SHCNE_DRIVEADD / SHCNE_DRIVEREMOVED / SHCNE_MEDIAINSERTED / SHCNE_MEDIAREMOVED. Обратите внимание, что этот метод зависит от службы обнаружения аппаратных средств оболочки (или как она там называется), но это гораздо проще, чем пытаться повторно реализовать эту функцию самостоятельно.

2 голосов
/ 17 ноября 2011

Существует очень хороший пример использования SHChangeNotifyRegister в «Образце наблюдателя изменений». Загрузите его с этого адреса:

http://msdn.microsoft.com/en-us/library/dd940348.aspx#downloading

Я реализовал SHChangeNotifyRegister в своем коде Qt.

Спасибо Люку за очень хороший ответ!

0 голосов
/ 30 мая 2010

Возможно, это ошибка драйверов устройств (я, конечно, думаю, что это так), но все они, похоже, работают одинаково ... НЕТ. Поэтому на данный момент я не думаю, что вы можете заставить разработчиков драйверов устройств изменять характеристики своих устройств, даже если Microsoft (вероятно, крупнейший разработчик) заставит вас поверить, что это должно работать именно так (не работает для моего драйвера для Microsoft Windows 7). Вставка SD-карты в USB-устройство просто не вызывает сообщение WM_DEVICECHANGE.

Используйте SHChangeNotifyRegister для устройств мультимедийного типа. Это не требует регистрации devicenotification. И вы можете получить букву диска через SHGetPathFromIDList. Используйте SHCNE_MEDIAINSERTED и SHCNE_MEDIAREMOVED.

Используйте устройство ONDeviceNotify, если вы ищете устройство, а не мультимедийное устройство, или вы можете написать собственный драйвер устройства.

См. Код этого комментария CodeProject - Ловушка сообщений Windows

0 голосов
/ 11 марта 2010

Может быть ошибка в драйвере SD-ридера. Описание в WM_DEVICECHANGE : «DBT_DEVICEARRIVAL 0x8000 Устройство или фрагмент носителя вставлен и теперь доступен.»

Следовательно, вы должны получить уведомление о вставке мультимедиа.

Вы пытались использовать RegisterDeviceNotification ? По умолчанию отправляются только некоторые уведомления, и смена носителя может быть не одной из них.

...