Что нового

Помогите понять функцию WM_DROPFILES и все что с ней связано

saraconor

Новичок
Сообщения
404
Репутация
3
Код:
$hGui = GUICreate('WM_DROPFILES', 725, 210, -1, -1, -1, $WS_EX_ACCEPTFILES)
$iEdit = GUICtrlCreateEdit('', 5, 5, 350, 200,'',$WS_EX_TRANSPARENT)
$iEdit2 = GUICtrlCreateEdit('', 370, 5, 350, 200,'',$WS_EX_TRANSPARENT)
GUISetState()
;=====================================================;
GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES")
Do
Until GUIGetMsg() = -3
Func WM_DROPFILES($hwnd, $msg, $wParam, $lParam)
$aCursorInfo = GUIGetCursorInfo($hGui)
Local $aRet = DllCall("shell32.dll", "int", "DragQueryFile", "int", $wParam, "int", -1, "ptr", 0, "int", 0)
Local $sDroppedFiles, $i, $tBuffer = DllStructCreate("char[256]")
For $i = 0 To $aRet[0] - 1
DllCall("shell32.dll", "int", "DragQueryFile", "int", $wParam, "int", $i, "ptr", DllStructGetPtr($tBuffer), "int", DllStructGetSize($tBuffer))
$sDroppedFiles &= DllStructGetData($tBuffer, 1) & @CRLF
Next
DllCall("shell32.dll", "none", "DragFinish", "int", $wParam)
$tBuffer = 0
;=====================================================;
if $aCursorInfo[4] = 3 then
GUICtrlSetData($iEdit, StringTrimRight($sDroppedFiles, 2))
else
GUICtrlSetData($iEdit2, StringTrimRight($sDroppedFiles, 2))
endif
EndFunc


Это часть кода в програмке, действует как и запланировано (принимает файлы в оба окошка) вот только к сожалению я не понимаю что происходит между разделителями (;============;), а использовать части кода без понимания происходящего не хочется, пожалуйсто, вставьте свои комментарии в каждую строку там, заранее благодарю.
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Произошло событие - в окно кинули файлы. Это событие обрабатывает пользовательская функция WM_DROPFILES. Из shell32.dll через dllcall вызывается функция DragQueryFile, возвращающая в $aRet[0] количество файлов. Далее создаётся структура "char[256]" (строка длинной 256), коия будет содержать путь к файлам. В цикле от 0 до $aRet[0] заполняем структуру файловыми путями и считываем это дело через DllStructGetData($tBuffer, 1) в $sDroppedFiles. Вызываем DragFinish, пишем пути в Edit.
 
Верх