Creat0R
Цитата:
вроде в функции уже есть возможность автоотключения кнопки ОК в нужный момент (если использовать $flag=1)
|
это в качестве примера использования
SendMessage... кстати, с помощью этого сообщения можно ограничить возможность выбора файлов по определенному признаку - имени, типу, etc. Но для этого придется наладить "диалог" с окном выбора, а без CallBack-функций этого не осуществить.
На оффсайте есть очень полезная тулза, возвращающая коды по всем (или почти всем) GUI-сообщениям:
http://www.autoitscript.com/forum/in...howtopic=32691
Цитата:
BFFM_SETEXPANDED (или может нужен BFFM_SETSELECTION?)
|
Естественно BFFM_SETSELECTION... BFFM_SETEXPANDED служит для раскрытия определенной ветки (+) без перемещения курсора. С сообщением BFFM_SETSELECTION есть одна тонкость - дело в том, что оно на самом деле передает не строку пути, а указатель на эту строку, т.е. адрес... но у разных процессов разные адресные пространства, если управляющий скрипт создаст строку и передаст ее адрес, то главный скрипт при попытке обращения по этому адресу скорее всего вывалится с ошибкой доступа памяти или типа того. Поэтому строку должен создать главный скрипт, сообщить ее адрес управляющему скрипту, а тот уже отправит корректное сообщение BFFM_SETSELECTION. Вот один из вариантов реализации, главный скрипт:
Код:

#include <GUIConstants.au3>
Global Const $BFFM_SETSELECTION = $WM_USER + 102 ; BFFM_SETSELECTION
$initDir = "C:\Windows\System32" ; Стартовый каталог
; Создаем и заполняем структуру для $initDir
$str = DllStructCreate ("char[260]")
DllStructSetData ($str, 1, $initDir)
; Ищем окно управляющего скрипта
$hOpenDialogControl = WinGetHandle ("_FileOpenDialogControl")
; Если найдено, отправляем сообщение с указателем
If Not @error Then
$ret = DllCall ("user32.dll", "int", "SendMessage", _
"hwnd", $hOpenDialogControl, _
"int", $BFFM_SETSELECTION, _
"int", 1, _
"ptr", DllStructGetPtr ($str) )
EndIf
; Открываем главное окно выбора
$files = _FileSelectFolder ('Тестирование выбора каталога')
Управляющий скрипт:
Код:

#include <GUIConstants.au3>
Global Const $BFFM_SETSELECTION = $WM_USER + 102 ; BFFM_SETSELECTION
Global $arrMsgSend [1][4]=[[0,0,0,0]] ; Массив сообщений для отправки
; Создаем фиктивное окно (для приема сообщений)
$hWndMain = GUICreate("_FileOpenDialogControl")
; Регистрируем наше пользовательское сообщение
GUIRegisterMsg ($BFFM_SETSELECTION, "_SaveMsgParms")
; Ждем открытия главного окна
WinWait ("Обзор папок")
; Обработка полученных сообщений
If $arrMsgSend[0][0] Then
$hMsgWnd = WinGetHandle ("Обзор папок")
For $i=1 To $arrMsgSend[0][0]
$ret = DllCall ("user32.dll", "int", "SendMessage", _
"hwnd",$hMsgWnd, _
"int", $arrMsgSend[$i][1], _
"int", $arrMsgSend[$i][2], _
"ptr", $arrMsgSend[$i][3] )
Next
EndIf
; Функция обработки входящих сообщений
Func _SaveMsgParms($hWnd, $iMsg, $WParam, $LParam)
Switch $iMsg
Case $BFFM_SETSELECTION
$arrMsgSend[0][0]+=1
ReDim $arrMsgSend[$arrMsgSend[0][0]+1][4]
$arrMsgSend[$arrMsgSend[0][0]][1] = $BFFM_SETSELECTION
$arrMsgSend[$arrMsgSend[0][0]][2] = $WParam
$arrMsgSend[$arrMsgSend[0][0]][3] = $LParam
EndSwitch
EndFunc