Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

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
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:00, 10-05-2007 | #389