Что нового

[Окна, Диалоги] Получить сообщение от winApi, что была поключена флешка

Nevich

Новичок
Сообщения
6
Репутация
0
Версия AutoIt: 3.3

Описание:
Бьюсь над вопросом не первую неделю. Не могу получить сообщение что флешка была подключена флешка. Может, я что-то не так делаю?
Я зациклил скрипт на ожидание сообщения от winapi. При получении такого сообщения, скрипт выходит из цикла. Но он не выходит. Обязательно ли надо создавать окно и на хандл этого окна получать сообщения от системы?
Можно ли это обойти?
Примечания:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Это теме место в разделе для новичков
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Надеюсь, это поможет.

Код:
#Include <GUIConstantsEx.au3>
#Include <WinAPIEx.au3>

Const $WM_DEVICECHANGE = 0x0219

Const $DBT_DEVICEARRIVAL = 0x8000
Const $DBT_DEVICEREMOVECOMPLETE = 0x8004
Const $DBT_DEVTYP_VOLUME = 0x00000002

Global $DevList = _GetDevList()

GUICreate('')
GUIRegisterMsg($WM_DEVICECHANGE, 'WM_DEVICECHANGE')

Do
Until GUIGetMsg() = -3

Func WM_DEVICECHANGE($hWnd, $msgID, $wParam, $lParam)
	Switch $wParam
		Case $DBT_DEVICEARRIVAL, $DBT_DEVICEREMOVECOMPLETE

			Local $Letter, $NewList = _GetDevList()

			Switch $wParam
				Case $DBT_DEVICEARRIVAL

					Local $tDEV_BROADCAST_VOLUME = DllStructCreate('int Size;int DeviceType;int Reserved;int UnitMask;ushort Flags', $lParam)

					If DllStructGetData($tDEV_BROADCAST_VOLUME, 'DeviceType') = $DBT_DEVTYP_VOLUME Then
						$Letter = _ArrayDiff($DevList, $NewList)
						Switch _WinAPI_GetDriveBusType($Letter)
							Case $DRIVE_BUS_TYPE_1394
								ConsoleWrite('FireWire device has been detected: ' & StringUpper($Letter) & @CR)
							Case $DRIVE_BUS_TYPE_USB
								ConsoleWrite('USB device has been detected: ' & StringUpper($Letter) & @CR)
;							Case etc. (see $DRIVE_BUS_TYPE_... constants from WinAPIEx.au3)

						EndSwitch
					EndIf
			EndSwitch
			$DevList = $NewList
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_DEVICECHANGE

Func _ArrayDiff(ByRef $ArrayMin, ByRef $ArrayMax)
	For $i = $ArrayMax[0] To 1 Step -1
		For $j = $ArrayMin[0] To 1 Step -1
			If $ArrayMax[$i] = $ArrayMin[$j] Then
				ContinueLoop 2
			EndIf
		Next
		Return $ArrayMax[$i]
	Next
	Return 0
EndFunc   ;==>_ArrayDiff

Func _GetDevList()

	Local $Drv = DriveGetDrive('REMOVABLE')

	If Not IsArray($Drv) Then
		Dim $Drv[1] = [0]
	EndIf
	Return $Drv
EndFunc   ;==>_GetDevList


WinAPIEx.au3
 
Автор
N

Nevich

Новичок
Сообщения
6
Репутация
0
Отлично, огромное спасибо.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Если тема решена, то соответственно нажми кнопочку в левом нижнем углу.
 
Верх