#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