Функция WM_DEVICECHANGE

 ↑  ←  Описание функции


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