как определить, что Windows закончила добавлять / удалять устройства хранения (не как буквы дисков, только как устройства) - PullRequest
2 голосов
/ 15 января 2011

У меня есть несколько компьютеров с упрощенной Windows, в которых добавленные / удаленные устройства хранения не получают автоматически буквы дисков.Поэтому я должен найти способ обнаружить, что добавлено / удалено.Один из способов (который я знаю) - с помощью сообщения WM_DEVICECHANGE.На этих компьютерах сообщение отправляется в Windows только с WParam 7 и LParam 0. Поэтому я мог запустить мой код обнаружения, когда это сообщение получено моим приложением.Проблема в том, что для полного распознавания устройства требуется некоторое время;тем временем мое приложение «бомбардируется» «залпом» сообщений WM_DEVICECHANGE, и код обнаружения запускается даже 6,7 раза.Чтобы решить, я мог бы добавить таймер, который повторно инициализируется новым сообщением;если по истечении некоторого времени (1,2 секунды) приложение не получает сообщение, запускается код обнаружения.Но мне не нравится этот подход на 100%, потому что он не учитывает другие факторы, такие как: скорость компьютера, другие программы, которые замедляют работу Windows, различные типы устройств хранения и т. Д. И тот факт, что код обнаружения заканчивается послезадержка это немного раздражает.

Кто-нибудь знает более профессиональное решение ...?

Спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 15 января 2011

Я играл с этими сообщениями вчера, и в моей тестовой программе я получаю только одно сообщение для добавления и одно для удаления, если я фильтрую сообщения.

См. Мой блог для более подробного описания.

0 голосов
/ 12 февраля 2011

Это правда, в большинстве случаев вы получаете множество сообщений.Мое решение этого было похоже на ваше, за исключением того, что вместо таймера я использовал поток.В этом случае мое время ожидания составляло 15 с (после DBT_DEVICEARRIVAL).

Фактически DBT_DEVICEARRIVAL - это именно то, что вы ищете, когда я смотрю на формулировку вашего вопроса.Устройство доступно в это время, даже если последуют дополнительные уведомления.При подключении USB-ключа я получаю следующее:

  • DBT_DEVNODES_CHANGED
  • DBT_DEVNODES_CHANGED
  • DBT_DEVNODES_CHANGED
  • DBT_DEVICEARRIVE_DB_DEVICE_REVE_DB_T_P_DEVICE_REVE_DBT_TEVPLE_DB_RETEдоступно)
  • DBT_DEVNODES_CHANGED
  • DBT_DEVNODES_CHANGED
  • DBT_DEVNODES_CHANGED

Для ваших целей уведомления DBT_DEVNODES_CHANGED не имеют значения.Вы заинтересованы исключительно в DBT_DEVICEARRIVAL ($ 8000 на языке Delphi).

Кроме того, было бы действительно полезно, если бы вы обращались к сообщениям по их символическому имени, а не по их номеру.

...