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

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

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

(*.*)


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


Конфигурация

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


Изменения
Автор: Vadikan
Дата: 21-01-2009
Описание: архив
Внимание!


В связи с созданием отдельного форума по AutoIt, эта тема переводится в архивное состояние. Если у вас есть вопрос, создайте новую тему или поднимите существующую, если в ней обсуждается аналогичная проблема.

Пожалуйста, не создавайте тем с названием "Помогите!" или "Нужна помощь по AutoIt". Это и так понятно Заголовок темы должен быть осмысленным.



Сайт программы
Русская справка
Коллекция AutoIt скриптов от Sanja Alone
Коллекция AutoIt скриптов от MSFN (могут быть устаревшие).


Справочник по командам rundll32 (команды запуска диалоговых окон и не только...)

AutoIt скрипты - введение и FAQ (статья содержит вводную информацию по AutoIt, а также ответы на ЧаВо).

Архивы старых тем по AutoIt или они же в 7z архиве (версии для печати) - 846 кб (настоятельно рекомендуется к прочтению/поиску)
(он же прикреплен в шапке)


Данная тема предназначена для общих вопросов по AutoIt. Вопросы по установке приложений при помощи AutoIt следует задавать в соответствии с правилами форума "Автоматическая установка приложений". Таким образом, если вы хотите узнать как установить Winamp 5.x при помощи AutoIt, то создайте тему [autoit] Winamp 5.х (если таковой еще нет на форуме). Проверить наличие тем можно при помощи поиска или фильтров.
Цитата Vadikan:
В теме уже свыше 500 сообщений и поиск нужной информации в ней усложняется. Есть предложение собрать все решения (скрипты) и разместить их на Wiki по принципу "один скрипт - одна статья wiki", добавляя статьи в категорию Autoit. Речь, в принципе, идет об общих решениях, а не о скриптах для установки конкретной программы. Название статьи, очевидно, должно отражать назначение скрипта. Затем можно в шапке просто разместить ссылки на статьи Wiki.

-------
Канал Windows 11, etc | Чат @winsiders

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

Отправлено: 00:02, 05-02-2006

 

Аватара для semiono

Ветеран


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

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


Код: Выделить весь код
Dim $var1 = '"' & @WindowsDir & '\' 

Run(@ComSpec & " /c " & 'rundll32.exe Shell32.dll,Control_RunDLL desk.cpl desk,@Themes /Action:OpenTheme /File:' & $var1 & 'Resources\Themes\Blackbox.theme"', "", @SW_HIDE)

WinWait("Display Properties", "", 3)

$handle = WinGetHandle("Display Properties", "")

WinSetState($handle, "", @SW_HIDE)

;ControlClick("Display Properties", "", "[Class:Button; Instance:3]", "Left", 1)
Send("{ENTER}")

Exit
:\ не работает

Последний раз редактировалось semiono, 12-11-2008 в 09:21.


Отправлено: 09:06, 12-11-2008 | #1141



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

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


Googler


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

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


semiono
Цитата semiono:
WinSetState($handle, "", @SW_HIDE)
;ControlClick("Display Properties", "", "[Class:Button; Instance:3]", "Left", 1)
Send("{ENTER}") »
http://forum.oszone.net/showthread.p...IDE#post694034

Отправлено: 09:22, 12-11-2008 | #1142


Аватара для semiono

Ветеран


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

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


Я понял фитчу! Дело в том что не все окна наверное умеют скрыться... Вот с MINIMIZE пошло!
------
А, ага! прочёл, но наверное не то чтобы нельзя нажать, а видимо свойства окна не позволяют его вообще скрыть!?
Хотя, главное что я понял в чём трабла, ато уже забодало, нажимать и смотреть результат!

-------
Полезное сообщение


Отправлено: 09:28, 12-11-2008 | #1143


Аватара для Creat0R

Must AutoIt


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

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


amel27, Я тут в придачу к твоим функциям _AU3_* написал ещё одну, _AU3_MergeAllLibs() - превращает исходный скрипт в один целый, со всеми инклюдами (указанными в нём) и константами. Для это мне пришлось немного изменить _AU3_GetAllLibUDF, чтобы возвращала ещё и полный путь к инклюду.

Код: Выделить весь код
_AU3_MergeAllLibs(@ScriptDir & "\Test.au3", 0, 0, 1)

; ===============================================================
; _AU3_MergeAllLibs($sScriptFile, $iIncludeComments=0, $iRemoveIncludes=1)
; ---------------------------------------------------------------
; Смешивает вложенные библиотеки в тело скрипта
;  (таким образом преобразовывая один цельный скрипт со всеим функциями и переменными)
; Использован AutoIT v3.2.12.1
;
; $sScriptFile        : AutoIT-скрипт для смешивания
; $iIncludeComments   : Определяет, нужно ли обрабатывать закомментированные строки
; $iIncludeEmptyLines : Определяет, нужно ли обрабатывать пустые строки
; $iRemoveIncludes    : Определяет, нужно ли удалять строки #include'ов с исходного скрипта
;
; Автор               : G.Sandler (a.k.a CreatoR)
; ===============================================================
Func _AU3_MergeAllLibs($sScriptFile, $iIncludeComments=0, $iIncludeEmptyLines=0, $iRemoveIncludes=1)
    Local $aGetAllLibs, $aScript_Content, $sRead_SrcScript, $sHeader_Content, $hFOpen, $iIsFuncBody = 0
    $sRead_SrcScript = FileRead($sScriptFile)

    _AU3_GetAllLibUDF($sRead_SrcScript, $aGetAllLibs)

    If $iRemoveIncludes Then $sRead_SrcScript = StringRegExpReplace($sRead_SrcScript, "(?i)(?s)#include.*?[\r\n]+", "")

    For $i = $aGetAllLibs[0][0] To 1 Step -1
        $iIsFuncBody = 0
        $aScript_Content = StringSplit(StringStripCR(StringStripWS(FileRead($aGetAllLibs[$i][1]), 3)), @LF)

        For $j = 1 To $aScript_Content[0]
            If Not $iIncludeEmptyLines And $aScript_Content[$j] = "" Then ContinueLoop
            If Not $iIncludeComments And StringLeft($aScript_Content[$j], 1) = ";" Then ContinueLoop

            If StringLeft($aScript_Content[$j], 8) = "#include" Then
                ContinueLoop ;We don't need the #includes, right?
            ElseIf StringLeft($aScript_Content[$j], 4) = "Func" Then
                $sRead_SrcScript &= @CRLF
                $iIsFuncBody = 1
            ElseIf StringLeft($aScript_Content[$j], 7) = "EndFunc" Then
                $sRead_SrcScript &= $aScript_Content[$j] & @CRLF
                $iIsFuncBody = 0

                ContinueLoop
            EndIf

            If Not $iIsFuncBody Then ;Write to the Begining of file (Collecting the variables/constants Header)
                $sHeader_Content &= $aScript_Content[$j] & @CRLF
            Else ;Write to the End of file (UDF functions)
                $sRead_SrcScript &= $aScript_Content[$j] & @CRLF
            EndIf
        Next
    Next

    If $sHeader_Content <> "" Then $sRead_SrcScript = $sHeader_Content & @CRLF & $sRead_SrcScript

    $hFOpen = FileOpen($sScriptFile, 2)
    FileWrite($hFOpen, $sRead_SrcScript)
    FileClose($hFOpen)
EndFunc ; ==> _AU3_MergeAllLibs

; ===============================================================
; _AU3_GetAllLibUDF($sScript_Content, $aIncludes_Arr)
; ---------------------------------------------------------------
; Возвращает массив всех загруженных UDF и библиотечных файлов
; Использован AutoIT v3.2.12.0
;
; $sScript_Content       : текст AutoIT-скрипта
; $aIncludes_Arr         : ссылка на переменную для выходного массива,
;                 по выходу содержит двумерный массив:
;                   $aIncludes_Arr[0][0]  - количество элементов в массиве
;                   $aIncludes_Arr[$i][0] - тип библиотечного файла
;                   $aIncludes_Arr[$i][1] - Полный путь библиотечного файла
;                   $aIncludes_Arr[$i][2] - Только имя библиотечного файла
;                   $aIncludes_Arr[$i][3] - массив UDF, определенных в файле
;
; Функция рекурсивная, поэтому выход по ошибке не предусмотрен
;
; Автор                  : amel27
; ===============================================================
Func _AU3_GetAllLibUDF($sScript_Content, ByRef $aIncludes_Arr)
    Local Const $rFile = '(?i)(?:^|[\n\r])[ \t]*#include[ \t]+((?:\<|")[^\n\r\"\>]+(?:\>|"))'
    Local Const $rUDFs = '(?i)(?:^|[\n\r])[ \t]*Func[ \t]+([\w\d]+)'

    ; Инициализация массива при первом входе / сохранение списка UDF
    If UBound($aIncludes_Arr, 2) <> 4 Then Dim $aIncludes_Arr[2][4] = [[1, 0, 0], [0, "", 0]]
    $aIncludes_Arr[$aIncludes_Arr[0][0]][3] = StringRegExp($sScript_Content, $rUDFs, 3)

    ; Инициализация переменных / Получение списка библиотечных файлов
    Local $sPath, $iType, $sName, $sText
    Local $aFile = StringRegExp($sScript_Content, $rFile, 3)

    ; Пофайловая обработка списка библиотек
    If IsArray($aFile) Then
        For $i = 0 To UBound($aFile)-1
            $sPath = _AU3_LibIncToPath($aFile[$i])                      ; полное имя файла
            If @error Then ContinueLoop                                 ; файл не найден

            $iType = @extended                                          ; тип библиотеки
            $sName = StringRegExpReplace($sPath, "(?:[^\\]+\\)+", "")   ; краткое имя файла

            ; Исключение повторной обработки / Чтение файла
            For $j = 1 To $aIncludes_Arr[0][0]
                If $aIncludes_Arr[$j][0] == $iType And $aIncludes_Arr[$j][2] == $sName Then ContinueLoop 2
            Next

            $sText = FileRead($sPath)
            If @error Then ContinueLoop

            ; При успешном чтении добавляем файл в выходной массив
            $aIncludes_Arr[0][0] += 1
            ReDim $aIncludes_Arr[$aIncludes_Arr[0][0]+1][4]

            $aIncludes_Arr[$aIncludes_Arr[0][0]][0] = $iType
            $aIncludes_Arr[$aIncludes_Arr[0][0]][1] = $sPath
            $aIncludes_Arr[$aIncludes_Arr[0][0]][2] = $sName

            ; Рекурсивный вызов на обработку текста библиотеки
            _AU3_GetAllLibUDF($sText, $aIncludes_Arr)
        Next
    EndIf
EndFunc ; ==> _AU3_GetAllLibUDF

; ===============================================================
; _AU3_LibIncToPath($sInclude)
; ---------------------------------------------------------------
; Возвращает полный путь к библиотечному файлу по строке загрузки
; Использован AutoIT v3.2.12.0
;
; $sInclude   : строка загрузки в формате #include, примеры:
;               '<array.au3>'
;               '"array.au3"'
;               '"c:\Program Files\AutoIT3\Include\array.au3"'
;
; При успехе  : возвращает полное имя файла, содержащее путь,
;               макрос @extended указывает на тип библиотеки:
;               1 - системная библиотека (каталог установки)
;               2 - текущая библиотека (каталог скрипта)
;               3 - пользовательская библиотека (путь из реестра)
;               4 - путь к библиотеке явно указан при загрузке
;
; При неудаче : возвращает пустую строку и устанавливает @error:
;               1 - ошибка формата строки
;               2 - файл не найден
;
; Автор       : amel27
; ===============================================================
Func _AU3_LibIncToPath($sInclude)
    Local $aRegExp = StringRegExp($sInclude, '^(<|")([^>"]+)(?:>|")$', 3)

    ; Проверка на корректность формата строки
    If Not IsArray($aRegExp) Then Return SetError(1, 0, "")
    $sInclude = $aRegExp[1]

    If StringInStr($sInclude, "\") = 0 Then
        Local $sSYS, $sUDL, $aUDL, $sAU3 = @ScriptDir & "\" & $sInclude

        ; Определение каталога системных библиотек
        $sSYS = StringRegExpReplace(@AutoItExe, "\\[^\\]+$", "")
        $sSYS &= "\Include\"& $sInclude

        ; Чтение списка каталогов пользовательских библиотек
        $sUDL = RegRead("HKCU\Software\AutoIt v3\AutoIt", "Include")
        $aUDL = StringRegExp($sUDL, "([^;]+)(?:;|$)", 3)

        ; Проверка типов 1 и 2 (до пользовательских библиотек)
        If $aRegExp[0] == '<' Then
            If FileExists($sSYS) Then Return SetError(0, 1, $sSYS)
        ElseIf $aRegExp[0] == '"' Then
            If FileExists($sAU3) Then Return SetError(0, 2, $sAU3)
        EndIf

        ; Проверка типа 3 (поиск среди пользовательских библиотек)
        If IsArray($aUDL) Then
            For $i = 0 To UBound($aUDL)-1
                $aUDL[$i] &= "\" & $sInclude
                If FileExists($aUDL[$i]) Then Return SetError(0, 3, $aUDL[$i])
            Next
        EndIf

        ; Проверка типов 1 и 2 (после пользовательских библиотек)
        If $aRegExp[0] == '<' Then
            If FileExists($sAU3) Then Return SetError(0, 2, $sAU3)
        ElseIf $aRegExp[0] == '"' Then
            If FileExists($sSYS) Then Return SetError(0, 1, $sSYS)
        EndIf
    Else
        ; Проверка типа 4 (файл с указанием полного пути)
        If FileExists($sInclude) Then Return SetError(0, 4, $sInclude)
    EndIf

    ; ОШИБКА: файл не найден
    Return SetError(2, 0, "")
EndFunc ; ==>  _AU3_LibIncToPath
Скрипт для тестирования - Test.au3:

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

$GUI = GUICreate("Test Script", 300, 200)

$Button = GUICtrlCreateButton("Button", 20, 40, 60, 20)

GUISetState(@SW_SHOW, $GUI)

While 1
    Switch GUIGetMsg()
        Case -3
            Exit
    EndSwitch
WEnd
Если запустить в AutoIt 3.2.8.1, то можно убедиться, что изменение структуры #includ'ов в новых версиях было оправдано, в одной лишь Array сколько констант и UDF'ов.

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

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

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


Отправлено: 01:33, 14-11-2008 | #1144


Аватара для semiono

Ветеран


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

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


Кто придумал эти си подобные языки! Или либо я в логике запутался, мне что <>1 что =1 трудно уловить так быстро. Но поидее после ControlCommand должна работать разумно, но оно вроде только выполняет либо чек, либо анчек при разных указаниях еррор и поидее вообще ничего не даёть. (нафиг нужно действие противоположное событию)

Если бы я "придумывал язык" я бы зделал - установить чекбокс (даже если он был установлен) и выполнять код дальше. Зачем усложняться то!
Столько функций и ни одной не могу выбрать, чтоб uncheck либо check безовсяких условий конкретно?
Код: Выделить весь код
ControlCommand ("License", "", "[Class:Button; Instance:5]", "IsChecked" , "")
If @error = 1 Then
ControlClick("License", "", "[Class:Button; Instance:5]", "Left", 1, 5, 11)
EndIf
ControlClick("License", "", "[Class:Button; Instance:2]", "Left", 1, 37, 11)

-------
Полезное сообщение


Отправлено: 07:57, 14-11-2008 | #1145


Googler


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

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


Creat0R
Цитата:
Я тут в придачу к твоим функциям _AU3_* написал ещё одну, _AU3_MergeAllLibs() »
_AU3_GetAllLibUDF делает много лишнего, для одних инклюдов можно и упростить
Цитата:
превращает исходный скрипт в один целый, со всеми инклюдами (указанными в нём) и константами »
кроме констант и UDF сейчас стало много инклудов с кодом инициализации (типа твоей GUICtrlSetOnHover), поэтому имхо есть смысл отпарсить константы регекспом перед перемещением в начало скрипта... И еще - имхо полностью убирать комменты не совсем политкорректно (у тебя это по умолчанию), как минимум нужно оставить ссылки на имя оригинального инклюда, откуда взят блок кода.

semiono
гм, забавно... сначала проверяется - стоит галка или нет на чекбоксе, и если при проверке возникла ошибка (например, чекбокса нет), то кликаем (?) левой кнопкой... а если проверка успешная (ура, такой чекбокс существует), то молча идем дальше - само состояние чекбокса тут вообще не проверяется, иначе было бы типа такого:
Код: Выделить весь код
$IsChecked = ControlCommand ("License", "", "[Class:Button; Instance:5]", "IsChecked" , "")
If $IsChecked = 1 Then ControlClick("License", "", "[Class:Button; Instance:5]", "Left", 1)

Отправлено: 08:40, 14-11-2008 | #1146


Аватара для Maza Faka

Ветеран


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

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


Цитата semiono:
я бы зделал - установить чекбокс (даже если он был установлен) »
Так и сделали Если тебе нужно просто отметить checkbox то необязательно проверять его состояние

-------
Сообщение помогло? Не забудьте нажать на Полезное сообщение

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

Отправлено: 08:47, 14-11-2008 | #1147


Googler


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

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


Maza Faka, где у меня ошибка?

Отправлено: 09:08, 14-11-2008 | #1148


Аватара для Creat0R

Must AutoIt


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

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


amel27,
Цитата amel27:
_AU3_GetAllLibUDF делает много лишнего, для одних инклюдов можно и упростить »
Я знаю, просто не хотил портить оригинальное назначение функии. Тем более что подобный функционал нужен только на «личном уровне».

Цитата amel27:
кроме констант и UDF сейчас стало много инклудов с кодом инициализации »
Имхо, оно не мешает, главное что оно будет подключено в той позиции в которой чередует сам инклюд.

Цитата amel27:
полностью убирать комменты не совсем политкорректно (у тебя это по умолчанию), как минимум нужно оставить ссылки на имя оригинального инклюда, откуда взят блок кода »
Если кто-то смешивает подобным образом скрипт, то комменты ему наверняка не нужны
Но идея неплохая, нужно чтобы если коменты не пишутся, добавлять имена инклюдов...

semiono,
Цитата semiono:
Если бы я "придумывал язык" я бы зделал - установить чекбокс (даже если он был установлен) и выполнять код дальше. Зачем усложняться то! »
Так есть же это уже:

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

$GUI = GUICreate("Test Script", 300, 200)

$CheckBox = GUICtrlCreateCheckbox("CheckMe!", 20, 40)
GUICtrlSetState($CheckBox, $GUI_CHECKED) ;Тут мы сами отмечаем птичку (ради проверки)

GUISetState(@SW_SHOW, $GUI)

ControlCommand($GUI, "", $CheckBox, "Check") ;Тут птичка будет отмечена в любом случае ;)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd
Т.е в твоём случае будет так:

Код: Выделить весь код
ControlCommand("License", "", "Button5", "Check")

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

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

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

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

Отправлено: 09:08, 14-11-2008 | #1149


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


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

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


И снова вопрос к спецам...
реально ли путь @ScriptFullPath получить в Dos кодировке? (дело в том, что его надо прописать в bat, а путь может содержать русские символы)
----------------
Мне нужно сделать так, чтобы после перезагрузки запустился скрипт. Там он будет "продолжать настройку" программы. Я, для этого, прописываю @ScriptFullPath в реестр, а точнее, в RunOnce. Я использую "компилированные" скрипты. Скрипт запускается, отрабатывает...., но существует проблема. Дело в том, что после запуска отрабатывает ТОЛЬКО скрипт, то есть все остальное, включая эксплорер, запускается только после того как отработает скрипт... Мне надо чтобы скрипт запустился в последнюю очередь. Я это пытаюсь сделать путем создания батника, в котором будет прописана команда запуска скрипта.
----------------
Может кто-то подкинет идею?

-------
ira furor brevis est


Отправлено: 09:16, 14-11-2008 | #1150



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[архив - Часть 2] AutoIt скрипты Vadikan AutoIt 985 21-01-2008 09:58
Вопрос - [Архив] Антивирусные программы - ОБЩИЕ ВОПРОСЫ FOX RED Защита компьютерных систем 67 21-11-2007 15:05
[Архив - Часть 1.3] AutoIt скрипты biork AutoIt 503 09-06-2007 11:27
[Архив - Часть 1.2] AutoIt скрипты Dirk Diggler AutoIt 505 02-12-2006 11:00
[Архив - Часть 1.1] AutoIt скрипты EgOrus AutoIt 335 04-02-2006 16:58




 
Переход