Автор Тема: [Окна, Диалоги] Получить сообщение от winApi, что была поключена флешка  (Прочитано 5485 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Nevich [?]

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

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

Русское сообщество AutoIt


Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
Это теме место в разделе для новичков

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2693
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Надеюсь, это поможет.

Код: AutoIt [Выделить]
#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
« Последнее редактирование: Март 14, 2010, 18:03:00 от Yashied »


Думай, прежде чем говорить.

Оффлайн Nevich [?]

  • Новичок
  • *
  • Сообщений: 6

  • Автор темы
  • Репутация: 0
    • Награды
Отлично, огромное спасибо.

Русское сообщество AutoIt


Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2693
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Если тема решена, то соответственно нажми кнопочку в левом нижнем углу.

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
0 Ответов
2292 Просмотров
Последний ответ Март 14, 2010, 10:42:57
от Kaster
5 Ответов
7352 Просмотров
Последний ответ Апрель 25, 2014, 09:35:09
от madmasles
8 Ответов
3036 Просмотров
Последний ответ Январь 31, 2012, 19:23:29
от pekich
17 Ответов
5796 Просмотров
Последний ответ Май 01, 2012, 01:06:34
от Dimmak
3 Ответов
3964 Просмотров
Последний ответ Октябрь 25, 2012, 09:27:24
от pekich
3 Ответов
2108 Просмотров
Последний ответ Октябрь 30, 2012, 20:11:16
от snoitaleR
2 Ответов
2076 Просмотров
Последний ответ Август 28, 2013, 19:25:00
от iahulg
1 Ответов
834 Просмотров
Последний ответ Январь 30, 2015, 11:29:57
от InnI
3 Ответов
1082 Просмотров
Последний ответ Февраль 19, 2015, 14:33:45
от vanduck
15 Ответов
6501 Просмотров
Последний ответ Апрель 18, 2015, 02:21:41
от InnI