Googler
Сообщения: 3665
Благодарности: 1563
|
Профиль
|
Отправить PM
| Цитировать
Creat0R
Автор DLL-ки подкинул идею, как можно попробовать реализовать средствами AutoIT... К сожалению, фокус прокатил только с классическим интерфейсом, но это уже большой плюс!.. Для окна в стиле Explorer без сторонних модулей видимо не обойтись.
Код: 
#include <GUIConstants.au3>
Global Const $BFFM_SETSELECTION = $WM_USER + 102
Global Const $BIF_BROWSEFORCOMPUTER = 0x1000 ; Выбирать только компьютеры в сетевом окружении
Global Const $BIF_BROWSEFORPRINTER = 0x2000 ; Выбирать только принтеры в сетевом окружении
Global Const $BIF_BROWSEINCLUDEFILES = 0x4000 ; Позволить выбирать файлы
Global Const $BIF_DONTGOBELOWDOMAIN = 0x2 ; Не открывать домены в сетевом окружении
Global Const $BIF_EDITBOX = 0x10 ; Включить строку редактирования
Global Const $BIF_RETURNONLYFSDIRS = 0x1 ; Выбирать только объекты файловой системы
Global Const $BIF_OLDSTYLEFLAGS = BitOR ($BIF_BROWSEFORCOMPUTER, $BIF_BROWSEFORPRINTER, $BIF_BROWSEINCLUDEFILES, _
$BIF_DONTGOBELOWDOMAIN, $BIF_EDITBOX, $BIF_RETURNONLYFSDIRS)
; Примитивный ГУИ для примера
$hWndMain = GUICreate ("Тест", 200, 45, -1, -1)
$Button_1 = GUICtrlCreateButton ("Выбрать папку", 55, 10)
GUISetState()
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
Case $msg = $Button_1
$res = _FileSelectFolderOldStyle ('Выбор объекта:', 0, $BIF_RETURNONLYFSDIRS, 'C:\Windows', $hWndMain)
MsgBox (0, "Выбран объект:", $res)
EndSelect
Wend
; Процедура инициализации стартового каталога
Func _FileSelectFolderOldStyleProc ($hWnd, $Msg, $wParam, $lParam)
$ret = DllCall ("user32.dll", "int", "SendMessage", _
"hwnd",$hWnd, _
"int", $BFFM_SETSELECTION, _
"int", 1, _
"ptr", $lParam )
EndFunc
Func _FileSelectFolderOldStyle ($text = '', $root = 0, $flags = 0, $iniDir = '', $hwnd = 0)
Local $ret, $pidl, $res = ''
; Создание структур данных
Local $ubi = DllStructCreate ("hwnd;ptr;ptr;ptr;int;ptr;ptr;int") ; управляющая структура BROWSEINFO
Local $utl = DllStructCreate ("char[512],char") ; текст окна
Local $urs = DllStructCreate ("char[260]") ; буфер для возвращаемого пути (длиной MAX_PATH)
Local $ulf = BitAnd ($flags, $BIF_OLDSTYLEFLAGS) ; фильтруем только разрешенные флаги
; Заполнение структур данных
DllStructSetData ($utl, 1, $text)
DllStructSetData ($ubi, 1, $hwnd)
DllStructSetData ($ubi, 3, DllStructGetPtr($urs))
DllStructSetData ($ubi, 4, DllStructGetPtr($utl))
DllStructSetData ($ubi, 5, $ulf)
If ($iniDir <> '') And ($hwnd <> 0) Then
Local $udr = DllStructCreate ("char[" & StringLen ($iniDir)+1 & "]")
DllStructSetData ($udr, 1, $iniDir)
$ret = DllCall ("user32.dll", "ptr", "GetWindowLong", "hwnd", $hwnd, "int", -4)
DllStructSetData ($ubi, 6, $ret[0])
DllStructSetData ($ubi, 7, DllStructGetPtr($udr))
EndIf
$ret = DllCall ("shell32.dll", "ptr", "SHGetSpecialFolderLocation", _
"int", 0 , "int", $root , "ptr", DllStructGetPtr($ubi, 2) )
If $ret[0] Then Return $res
GUIRegisterMsg (1, "_FileSelectFolderOldStyleProc") ; регистрируем событие для перехвата
; Открытие окна выбора каталога
$pidl = DllCall ("shell32.dll", "ptr", "SHBrowseForFolder", "ptr", DllStructGetPtr ($ubi))
GUIRegisterMsg (1, "") ; разрегистрируем событие
If $pidl[0] Then
$ret = DllCall ("shell32.dll", "int", "SHGetPathFromIDList", _
"ptr", $pidl[0], "ptr", DllStructGetPtr ($urs))
If $ret[0] Then $res = DllStructGetData ($urs, 1)
DllCall ("ole32.dll", "int", "CoTaskMemFree", "ptr", $pidl[0]) ; чистим за собой
EndIf
DllCall ("ole32.dll", "int", "CoTaskMemFree", "ptr", DllStructGetData ($ubi, 2))
Return $res ; Вывод результата
EndFunc
|