WM_DEVICECHANGE
Сообщение выполняется при подключении или отключении устройств к системе.
Параметры
Указанные параметры передаются системой.$wParam | Содержит флаг подключения или отключения устройства $DBT_DEVICEARRIVAL = 0x8000 ; Новое устройство подключено и готово к использованию $DBT_DEVICEQUERYREMOVE = 0x8001 ; Запрос на удаление устройства. Любое приложение может отменить удаление. Чтобы разрешить удаление, надо вернуть TRUE. Чтобы отменить удаление, надо вернуть BROADCAST_QUERY_DENY $DBT_DEVICEQUERYREMOVEFAILED = 0x8002 ; Удаление устройства прервано $DBT_DEVICEREMOVEPENDING = 0x8003 ; Устройство сейчас будет удалено. Нельзя отменить удаление. Возвращает TRUE. $DBT_DEVICEREMOVECOMPLETE = 0x8004 ; Устройство отключено $DBT_DEVICETYPESPECIFIC = 0x8005 ; type specific event $DBT_DEVNODES_CHANGED = 0x0007 ; любое изменение в аппаратном профиле |
$lParam |
Указатель на структуру Структура $DEV_BROADCAST_HDR задаёт тип устройств для отслеживания dbch_size - размер структуры в байтах. dbch_devicetype - тип устройства, например $DBT_DEVTYP_VOLUME - логический раздел $DBT_DEVTYP_OEM = 0x00000000 ; oem-defined device type $DBT_DEVTYP_DEVNODE = 0x00000001 ; devnode number $DBT_DEVTYP_VOLUME = 0x00000002; логический раздел $DBT_DEVTYP_PORT = 0x00000003 ; serial, parallel $DBT_DEVTYP_NET = 0x00000004 ; network resource dbch_reserved - зарезервировано, не используется или структура $DEV_BROADCAST_VOLUME, если dbch_devicetype возвращает $DBT_DEVTYP_VOLUME dbch_size - размер структуры в байтах. dbch_devicetype - тип устройства (тоже что выше указанные) dbch_reserved - зарезервировано, не используется dbcv_unitmask - битовая маска, соответствие числа (бита) с буквой диска 0 = A 1 = B ... 26 = Z dbcv_flags - флаг Для отслеживания всех устройств поле dbch_devicetype должно быть равен значению $DBT_DEVTYP_DEVICEINTERFACE и включать $DEVICE_NOTIFY_ALL_INTERFACE_CLASSES для получения сообщений об изменении всех классов устройств. |
Примечания
Смотрите функцию GUIRegisterMsg.Пример
; rasim
; http://www.autoitscript.com/forum/topic/79460-usbmon/
#include <GUIConstantsEx.au3>
Global Const $WM_DEVICECHANGE = 0x0219
Global Const $DBT_DEVICEARRIVAL = 0x8000 ; Найдено новое устройство
Global Const $DBT_DEVICEREMOVECOMPLETE = 0x8004 ; Устройство отключено
Global Const $DBT_DEVTYP_VOLUME = 0x00000002 ; Логический диск
Global $k = 0
$Gui = GUICreate("WM_DEVICECHANGE", 370, 140)
GUICtrlCreateLabel('Функция WM_DEVICECHANGE выполняется при подключении или отключении устройств к системе. Попробуйте вставить флешку', 5, 5, 360, 70)
GUISetState()
GUIRegisterMsg($WM_DEVICECHANGE, "WM_DEVICECHANGE")
Do
Until GUIGetMsg() = -3
Func WM_DEVICECHANGE($hWnd, $Msg, $wParam, $lParam)
$k += 1
WinSetTitle($Gui, '', 'Вызов ' & $k)
If ($wParam = $DBT_DEVICEARRIVAL) Or ($wParam = $DBT_DEVICEREMOVECOMPLETE) Then
Local $DEV_BROADCAST_VOLUME = DllStructCreate("int dbcvsize;int dbcvdevicetype;int dbcvreserved;int dbcvunitmask;" & _
"ushort dbcvflags", $lParam)
Local $iDriveType = DllStructGetData($DEV_BROADCAST_VOLUME, "dbcvdevicetype")
Else
Return $GUI_RUNDEFMSG
EndIf
; Если устройство не является логическим диском, то выход из функции
If $iDriveType <> $DBT_DEVTYP_VOLUME Then Return $GUI_RUNDEFMSG
Local $iMask = DllStructGetData($DEV_BROADCAST_VOLUME, "dbcvunitmask")
$iMask = Log($iMask) / Log(2)
Local $iDrive = Chr(65 + $iMask) & ":"
Switch $wParam
Case $DBT_DEVICEARRIVAL ; обнаружение устройства
TrayTip("WM_DEVICECHANGE", "Устройство подключено", 5, 1)
Case $DBT_DEVICEREMOVECOMPLETE ; отключение устройства
TrayTip("WM_DEVICECHANGE", "Устройство отключено", 5, 2)
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc