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

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [Архив - Часть 1.3] AutoIt скрипты

Закрытая тема
Настройки темы
[Архив - Часть 1.3] AutoIt скрипты

Старожил


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

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


Изменения
Автор: Vadikan
Дата: 25-01-2008
Внимание!
Тема переведена в архивное состояние





(настоятельно рекомендуется к прочтению/поиску)


Руководство к действию по работе c AutoIt.

Помогите пожалуйста. Нужен маленький скриптик для решения некоторых рутинных задачь.
Вот что нужно сделать последовательно:

1) в папке DIR1 находим и удаляем файлы в названии которых присутствует text_1
2) в папке DIR2 находим xxx.sif и удаляем строки, в которых присутствует text_1
3) в папке DIR3 находим xxx.inf и добавляем в его секцию [XXX] несколько строчкек (text_2, text_3, ..., text_n)
4) в папке DIR4 находим yyy.inf ищем в его секции [YYY] text_4 и заменяем его на text_5
5) сохраняем все изменения и выводим отчёт о проделанной работе :-)

Заранее благодарен.

Отправлено: 05:05, 03-12-2006

 

Аватара для Creat0R

Must AutoIt


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

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


TERMINAL
Цитата:
нужно скриптом определить эти диски и отформатить D,E
Что значит определить? по каким параметрам их определять?

Чтобы отформатировать диск, можно использовать ком. строку:

Код: Выделить весь код
$DriveToFormat = 'Z:'
$Confirm = 'no'; 'yes' для подтверждения удаления

$FOpen = FileOpen(@TempDir & '\Answer.tmp', 2)
FileWrite($FOpen, $Confirm)
FileClose($FOpen)

$CmdPid = Run(@ComSpec & ' /c formart ' & $DriveToFormat & ' < "' & @TempDir & '\Answer.tmp"')

While Not ProcessExists($CmdPid)
    Sleep(10)
WEnd

FileDelete(@TempDir & '\Answer.tmp')
На всякий случай я специально подставил переменной $DriveToFormat значение буквы диска Z, и переменной $Confirm значениие 'no' (не подтверждать форматирование), запускать этот скрипт очень осторожно, если у переменной $Confirm поставить значение 'yes', то следует полагать что диск будет отформатирован без подтверждения - сам не проверял (проверял метод на реестре).

Системны диск отформатировать из запущенной Windows не получится .

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 00:51, 05-05-2007 | #381



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


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


Googler


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

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


Creat0R
Цитата:
Как можно средставми RegExp осуществлять массовую замену в переменной?
RegExp подерживает только одну заменяющую строку (3-й параметр), причем она даже не является регулярным выражением (за исключением групповых подстановок)... а в чем собственно проблема?.. неужели так существенна одна лишняя строка кода?

Отправлено: 09:15, 05-05-2007 | #383


Аватара для Creat0R

Must AutoIt


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

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


amel27
Цитата:
На оффсайте есть очень полезная тулза, возвращающая коды по всем (или почти всем) GUI-сообщениям:
Класс, именно это я давно(?) и искал, спасибо.

Цитата:
Поэтому строку должен создать главный скрипт, сообщить ее адрес управляющему скрипту, а тот уже отправит корректное сообщение BFFM_SETSELECTION
А обязательно создавать фиктивное окно, пмещать в массив данные и передавать обратно в окно выбора каталога?
Может можно как то передавать нужные данные через ком. строку? (в этот же скрипт к примеру).

Но вообще, оно работает, огромнейшее спасибо за пример - спустя полтора часа колдования над ним, мне наконец удалось поместить всё это в более или менее юзабельные UDF'ы (см. ниже пример).

Правда есть один момент - Не получается нормально определить заголовок окна выбора каталога (Обзор папок), хотелось сделать универсально, но даже при попытке использовать класс имени окна ("classname=#32770"), почему то вместо окна обзора папок находит окно диспетчера задач... и кстати, интересно, в английской версии Windows как это окно называется, я предположил что Select folder, но не уверен.

Вот собственно адаптированные функции и пример использования:

Пример:

Код: Выделить весь код
#include <GUIConstants.au3>
#NoTrayIcon

Global Const $BFFM_SETSELECTION = $WM_USER + 102

_FileSelFolderHandler()

$hWnd = WinGetHandle(WinGetTitle(""))
$InitDir = @WindowsDir
$FileNeeded = "Notepad.exe"

While 1
    $Ret = _FileSelectFolder('Select Folder', 0, 1, $InitDir, $hWnd)
    If @error Then ExitLoop
    If FileExists($Ret & "\" & $FileNeeded) Then ExitLoop

        MsgBox(48, "Error", "Please select folder that contain " & $FileNeeded, 3)
    $InitDir = $Ret
WEnd

If Not @error Then MsgBox(64, "Results", "File <" & $FileNeeded & "> was found in selected directory (" & $Ret & ")")
На заметку - В начале примера присутствие функции _FileSelFolderHandler() жизнено необходимо, иначе вас ждёт весьма неприятная учесть (которая постигла меня) - скрипт “начнёт запускать себя” бесконечно, я наверно минут 5 боролся с его процессами вооружившись ProcessKiller'ом

Функции:

Код: Выделить весь код
Func _FileSelectFolder($title, $root = 0, $flags = 0, $InitDir = '', $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 = BitOR (BitShift(BitAnd ($flags,1),-9), _ ; 1: не позволять создавать новые каталоги
        BitShift(BitAnd ($flags,2),-5), _ ; 2: использовать новый стиль диалога
        BitShift(BitAnd ($flags,4),-2), 1) ; 4: включить cтроку редактирования ;Последняя единица для деактивирования кнопки OK.
    ; Заполнение структур данных
    DllStructSetData ($utl, 1, $title)
    DllStructSetData ($ubi, 1, $hwnd)
    DllStructSetData ($ubi, 3, DllStructGetPtr($urs))
    DllStructSetData ($ubi, 4, DllStructGetPtr($utl))
    DllStructSetData ($ubi, 5, $ulf)
    $ret = DllCall ("shell32.dll", "ptr", "SHGetSpecialFolderLocation", _
        "int", 0 , _
        "int", $root , _
        "ptr", DllStructGetPtr($ubi, 2))
    If $ret[0] Then Return $res
    
	;Запуск управляющего скрипта
	Local $RunLine = '"' & @ScriptFullPath
	If Not @Compiled Then $RunLine = @AutoItExe & ' "' & @ScriptFullPath
	Run($RunLine & '" /SetInitDir')
	
    WinWait("_FileOpenDialogControl", "", 3)
	
	; Создаем и заполняем структуру для $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
	
	; Открытие окна выбора каталога
	$pidl = DllCall ("shell32.dll", "ptr", "SHBrowseForFolder", "ptr", DllStructGetPtr ($ubi))
    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]) ; чистим за собой
    Else
		Return SetError(1)
	EndIf
    DllCall ("ole32.dll", "int", "CoTaskMemFree", "ptr", DllStructGetData ($ubi, 2))
    Return $res ; Вывод результата
EndFunc

Func _FileSelFolderHandler()
	If $CmdLine[0] > 0 And $CmdLine[1] = "/SetInitDir" Then 
		Local $FSFTitle = "Обзор папок", $hMsgWnd
		If @OSLang <> 0419 Then $FSFTitle = "Select Folder"
		Global $arrMsgSend [1][4]=[[0,0,0,0]]
		
		Local $hWndMain = GUICreate("_FileOpenDialogControl")
		GUIRegisterMsg ($BFFM_SETSELECTION, "_SaveMsgParms")
		
		WinWait($FSFTitle, "", 3)
		
		If $arrMsgSend[0][0] Then
			$hMsgWnd = WinGetHandle($FSFTitle)
			For $i=1 To $arrMsgSend[0][0]
				DllCall ("user32.dll", "int", "SendMessage", _
					"hwnd",$hMsgWnd, _
					"int", $arrMsgSend[$i][1], _
					"int", $arrMsgSend[$i][2], _
					"ptr", $arrMsgSend[$i][3] )
			Next
		EndIf
		Exit
	EndIf
EndFunc

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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Последний раз редактировалось Creat0R, 05-05-2007 в 15:32.


Отправлено: 11:52, 05-05-2007 | #384


Аватара для Creat0R

Must AutoIt


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

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


amel27
Цитата:
в чем собственно проблема?.. неужели так существенна одна лишняя строка кода?
Эх, если-бы одна... иногда такие замены приходится делать по 10, а то и 20 раз...

В общем решил я эту задачку UDF'ным путём ...

Код: Выделить весь код
$String = 'file://localhost/%22c:/my%20test/test.zip%22'
$Patern = 'file://localhost/|/|%20|%22'
$Replace = '|\\| |"'

$Results = _StringRexExpReplaceEx($String,

MsgBox(64, "Results", $Results) ;На выходе имеем это: "c:\my test\test.zip"

Func _StringRexExpReplaceEx($String, $Patern, $Replace)
    If StringInStr($Patern, '|') And StringInStr($Replace, '|') Then
        Local $PaternArr = StringSplit($Patern, '|')
        Local $ReplaceArr = StringSplit($Replace, '|')
        Local $Ret = $String
        Local $Ubound = UBound($ReplaceArr)
        If UBound($PaternArr) <= UBound($ReplaceArr) Then $Ubound = UBound($PaternArr)
        For $i = 1 To $Ubound-1
            $Ret = StringRegExpReplace($Ret, $PaternArr[$i], $ReplaceArr[$i])
        Next
        Return $Ret
    Else
        Return StringRegExpReplace($String, $Patern, $Replace)
    EndIf
EndFunc
Правда не удаётся сделать замену по ссимволу | - но мне пока что это не нужно

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Последний раз редактировалось Creat0R, 05-05-2007 в 12:45. Причина: Изменил немного пример в коде.


Отправлено: 12:37, 05-05-2007 | #385


Googler


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

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


Creat0R
Цитата:
А обязательно создавать фиктивное окно, пмещать в массив данные и передавать обратно в окно выбора каталога?
- Без GUI-окна некому будет отправлять GUI-сообщение... Конечно, в Windows есть и другие способы межпроцессного обмена, просто я не мудрствуя использовал тот же метод доставки, что и для окна "Обзор папок" (через SendMessage). Альтернативный способ - расшарить именованный кусок памяти, но для этого придется опять колдовать с API-функциями... Через консоль наверно тоже можно, но без "извращений" не обойдется, так как строго говоря AutoIT-приложения не являются консольными;
- для одного сообщения массив понятно не нужен, это я с запасом на обработку нескольких сообщений зарядил SWITCH, ну и соответственно массив;
Цитата:
Не получается нормально определить заголовок окна выбора каталога (Обзор папок)
ну да, проблематично определить HWID окна, которое еще не создано ... тем более, что класс у него вполне стандартный, как вариант - использовать для идентификации кроме заголовка - текст окна, переданный первым параметром функции.

ADD:помнится, я еще практиковал межскриптовый обмен через ключи рееестра... скажем, один меняет значение извеcтного параметра, а второй в цикле отслеживает эти значения и делает свои выводы (по SWITH)... хотя это было вызвано совсем другими причинами - оба скрипта крутились под разными учетками, один под SYSTEM, а второй под рядовым пользователем.

Последний раз редактировалось amel27, 06-05-2007 в 09:57.

Это сообщение посчитали полезным следующие участники:

Отправлено: 09:02, 06-05-2007 | #386


Googler


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

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


Creat0R

Вроде разобрался с DLL-кой, проблема была не в GUIRegisterMsg (она-то как раз работает), а в самой DLL-ке... Нашел где подправить чтобы запустилась, осталось только состыковаться с автором и перекомпилить как надо.

Все-таки через CallBack все выглядит намного круче - можно по ходу получать инфу о выбранных файлах/каталогах, фильтрах, контролировать правильность ввода в Edit-Boxе и на основании этого менять подстветку, текст кнопок или текст статус-бара.

Отправлено: 11:30, 07-05-2007 | #387


Новый участник


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

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


Цитата:
Покопался я насчёт этого вопроса. Но только начал копать в сторону меню у папок и файлов и пришёл к выводу, что такие пункты как "WinRAR", "Проверить на вирусы" (Kaspersky) добавляются из .dll-файлов. Потом даже открыл какой-то из файлов WinRAR,а и нашёл там строки из контекстного меню.
А у меня на рабочем столе в меню есть пункт "Панель управления NVIDIA", которую можно убирать через настройки. Я думаю с этим пунктом таже история, что и с WinRAR - как-то через DLL. Короче на данном этапе врядли что-то получится сделать.
Я в общем покопался ещё с этой всей фигнёй. И у меня получилось всё ьаки добавить свой пункт в меню. Проблема в том что на неё нельзя повесить команду, а только ID.
Код: Выделить весь код
MENUITEM "Мой пункт", 29640
Где можно узнать или где содержится этот список команд и соответствующих им ID?

Нашёл ссылку, вроде бы относящуюся к делу: http://msdn2.microsoft.com/en-us/library/aa381023.aspx

Отправлено: 16:30, 07-05-2007 | #388


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


Аватара для Creat0R

Must AutoIt


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

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


amel27
Цитата:
К сожалению, фокус прокатил только с классическим интерфейсом, но это уже большой плюс!
Это огромный плюс!!! а зачем больше, классика есть классика - Тем более что строка состояния есть, возможность выбора только объектов файловой системы есть, "родительский/дочерний статус" есть , и даже есть опция выбора не только каталогов, но и файлов!!! (о чём я лично, вообще и не подозревал в подобном диалоге)... что ещё нужно?

Большое спасибо тебе, и автору идеи!

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 14:45, 10-05-2007 | #390



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [Архив - Часть 1.3] AutoIt скрипты

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Открывая 7z архив пишет не удаётся открыть как архив. Можно ли его восстановить? DreDo Хочу все знать 4 01-12-2009 18:54
[Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:. Vadikan AutoIt 1543 18-01-2009 10:46
[архив - Часть 2] AutoIt скрипты Vadikan AutoIt 985 21-01-2008 09:58
[Архив - Часть 1.2] AutoIt скрипты Dirk Diggler AutoIt 505 02-12-2006 11:00
[Архив - Часть 1.1] AutoIt скрипты EgOrus AutoIt 335 04-02-2006 16:58




 
Переход