Delphi: Работа с устройствами в Windows - Отслеживание изменений в аппаратной конфигурации

ОГЛАВЛЕНИЕ

Отслеживание изменений в аппаратной конфигурации

Каждый раз, когда происходят какие-либо изменения в аппаратном профиле, главному окну приложения посылается сообщение WM_DEVICECHANGE.При получении этого сообщения WParam содержит код события. Нас интересуют только три кода: DBT_DEVICEARRIVAL, DBT_DEVICEREMOVECOMPLETE и DBT_DEVNODES_CHANGED.

Событие DBT_DEVNODES_CHANGED обозначает, что произошли изменения в аппаратном профиле. LParam в данном случае равен нулю. События DBT_DEVICEARRIVAL и DBT_DEVICEREMOVECOMPLETE идентичны и различаются тем, что первое событие обозначает присоединение устройства и второе отсоединение устройства. LParam отличен от нуля при этих событиях и указывает на структуру DEV_BROADCAST_HDR. В зависимости от поля dbch_devicetype в жтой структуре дальнейшие поля могут варьироваться. Например, если dbch_devicetype равен DBT_DEVTYP_VOLUME, то LParam в этом случае указывает на структуру DEV_BROADCAST_VOLUME и поле dbcv_unitmask в этой структуре содержит битовую маску новых дисков. (нулевой бит обозначает букву А, второй букву B, третий букву C и так далее).

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

Для того чтобы «подписаться» на сообщения системы надо вызвать функцию RegisterDeviceNotification:

HDEVNOTIFY WINAPI RegisterDeviceNotification(
  __in HANDLE hRecipient,
  __in LPVOID NotificationFilter,
  __in DWORD Flags
);

Первый параметр это хендл статуса сервиса либо хендл формы. Параметр NotificationFilter является указателем на структуру DEV_BROADCAST_HDR и задаёт тип устройств для отслеживания. Для отслеживания всех устройств поле dbch_devicetype должно быть равно значению DBT_DEVTYP_DEVICEINTERFACE. Для получения изменений всех классов устройств. Если третий параметр равен DEVICE_NOTIFY_WINDOW_HANDLE, то первый параметр должен быть хендлом окна, если DEVICE_NOTIFY_SERVICE_HANDLE, то первый параметр это хендл статуса сервиса. Также для получения сообщений об изменении всех классов устройств этот параметр должен включать флагDEVICE_NOTIFY_ALL_INTERFACE_CLASSES.

Вот и конец этой статьи. К статье прилагается исходник на Delphi с примером получения списка устройств, примером отключения устройства, безопасным отключением устройства, а также ведением лога изменений в аппаратном профиле.

Автор: rpy3uH, pblog.ru

Исходный код примеров