; 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