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

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

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


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

Отправлено: 08:53, 05-05-2007 | #382