WM_DROPFILES
Сообщение выполняется при бросании файлов или папок на элементы окна программы.
Параметры
Указанные параметры передаются системой.$wParam | Дескриптор структуры перетаскиваемых файлов |
$lParam |
- |
Примечания
Смотрите функцию GUIRegisterMsg.Пример
#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