Функция WM_DROPFILES

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


WM_DROPFILES

Сообщение выполняется при бросании файлов или папок на элементы окна программы.

Параметры

Указанные параметры передаются системой.
$wParam Дескриптор структуры перетаскиваемых файлов
$lParam -

Примечания

Смотрите функцию GUIRegisterMsg.
Используется DragQueryFile для получения количества файлов и путей. Используйте DragQueryPoint для получения координат точки, в которой была отпущена кнопка мыши при бросании файлов.
Окно должно иметь стиль $WS_EX_ACCEPTFILES. Не используйте для элементов стиль $GUI_DROPACCEPTED, назначаемый функцией GUICtrlSetState, так как это включит нативный механизм drag & drop. В отличии от нативного механизма эта функция не вставляет имена файлов в окно принудительно, соответственно позволит открыть содержимое файла или выполнить иные операции.

Пример

#include <WindowsConstants.au3>
; Global Const $WM_DROPFILES = 0x0233 ; в AutoIt3 v3.3.6.1 эта константа не определена
Global $k = 0
Global Const $hUSER32 = DllOpen("user32.dll")
Global Const $hSHELL32 = DllOpen("shell32.dll")

$sDescription = 'Функция WM_DROPFILES выполняется при перетаскивании объектов на элементы окна' & @CRLF & _
        'В отличии от нативного механизма функция не вставляет принудительно путь в элемент Edit'

$hGui = GUICreate('WM_DROPFILES', 600, 360, -1, -1, -1, $WS_EX_ACCEPTFILES)
$iEdit = GUICtrlCreateEdit($sDescription, 5, 5, 590, 300)
GUISetState()
GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES")

Do
Until GUIGetMsg() = -3

Func WM_DROPFILES($hwnd, $msg, $wParam, $lParam)
    ; Local $tPoint = DllStructCreate('int X;int Y')
    ; DllCall("shell32.dll", "int", "DragQueryPoint", "int", $wParam, "ptr", DllStructGetPtr($tPoint))
    ; $iX = DllStructGetData($tPoint, "X")
    ; $iY = DllStructGetData($tPoint, "Y")
    $k += 1
    WinSetTitle($hGui, '', 'Вызов ' & $k)
    Local $aCursorInfo = GUIGetCursorInfo($hGui) ; определяет элемент под курсором в момент бросания
    If Not @error And $aCursorInfo[4] = $iEdit Then
        Local $aCall, $sDroppedFiles
        ; возвращает количество файлов и папок
        $aCall = DllCall($hSHELL32, "dword", "DragQueryFileW", "handle", $wParam, "dword", -1, "wstr", "", "dword", 0)
        If @error Or Not $aCall[0] Then Return SetError(1, 0, "")
        For $i = 0 To $aCall[0] - 1 ; цикл запрашивает все файлы и папки
            $aCall = DllCall($hSHELL32, "dword", "DragQueryFileW", "handle", $wParam, "dword", $i, "wstr", "", "dword", 32767)
            If @error Or Not $aCall[0] Then ; Если ошибка или каталог
                ExitLoop
            Else
                $sDroppedFiles &= $aCall[3] & @CRLF ; имя файла или папки присоединяется к результату
            EndIf
        Next
        DllCall($hSHELL32, "none", "DragFinish", "handle", $wParam)
        GUICtrlSetData($iEdit, StringTrimRight($sDroppedFiles, 2)) ; Вставлять пути не обязательно, важно событие. Если требуется длительная обработка, то сюда не вставлять
        ; WinActivate($hGUI) ; активирует окно, в которое брошены файлы
        Return 1
    EndIf
    Return 1
EndFunc   ;==>WM_DROPFILES