Четверг, 21.11.2024
Персональный сайт Заноги Александра
Содержание
Категории каталога
Мои статьи [26]
Главная » Статьи » Мои статьи

AutoIt
Эта статья появилась на сайте ввиду популярности AutoIt у посетителей форума Автоматической Установки Windows. Статья состоит из двух частей. В первой - введение в AutoIt, целиком взятое из русской справки к AutoIt, которую очень грамотно перевел с английского Валерий Иванов. К сожалению, найти координаты автора не удалось, но хочется верить, что он не возражает против публикации его трудов. Я настоятельно рекомендую загрузить справку и ознакомиться с уроками, из которых вы сразу узнаете, насколько просто автоматизировать установку приложений при помощи AutoIt. Вторая часть статьи представляет собой список часто задаваемых на конференции Oszone вопросов о работе с AutoIt. Ответы, конечно, прилагаются. "Oszone AutoIt FAQ" для вас подготовил Sanja Alone.
Введение в AutoIt

AutoIt v3 - это язык для написания сценариев, напоминающий BASIC. Основным его назначением является автоматизация работ с Windows GUI (графическим интерфейсом пользователя MS Windows). Для выполнения этой сложной задачи предоставляется комбинация испытанных методов, включающих в себя - симуляцию нажатий комбинаций клавиш клавиатуры, перемещения указателя мыши и управления окнами и его визуальными элементами. Как показывает практика, эти "приводные ремни" весьма эффективны для получения работающих решений в ситуациях, когда другие стандартные средства (например, VBScript и SendKeys) оказываются бессильны.

По замыслу AutoIt предполагался быть средством "тиражирования конфигураций" ПК. Но с момента создания третьей версии его возможности могут быть использованы для реализации "кухни" автоматизации - написания сценариев решения различных задач, в том числе и для администрирования системы.

AutoIt умеет:
Симулировать нажатия комбинаций клавиатуры (поддерживается основная масса раскладок клавиатуры)
Симулировать перемещения указателя мыши и нажатия на ее кнопки
Перемещать, менять размер и управлять параметрами отображения окон
Непосредственно взаимодействовать с "управляющими элементами" (controls) окна (получать/менять надпись, перемещать, отключать, и т.п. действия)
Работать с буфером обмена для пересылки его текстового содержания
Читать, менять и создавать ключи и значения реестра

Новая версия AutoIt3 распознает общепринятые конструкции и имеет стандартный синтаксис, напоминающий синтаксис VBScript и BASIC, и поддерживает обработку сложных выражений, выполнение собственных функций, проводить циклические и условные вычисления. Помимо этого AutoIt3 приспособлен для всего того, что уже давно используют ветераны-сценаристы.

Как и раньше AutoIt имеет небольшой размер интерпретатора (~100KB), который является самостоятельным и не ссылается на другие, кроме системных .dll библиотек. Он намеренно не делает самостоятельных или скрытых записей в реестре, кроме обязательных и составляющих процесс полной установки. Сценарии могут быть скомпилированы в независимые выполняемые файлы с помощью поставляемого компилятора сценариев - Aut2Exe.

Вместе с интерпретатором модернизируются ActiveX и DLL версия AutoIt, которые называются AutoItX3. Эта библиотека представляет собой объединенный композит (COM и стандартная DLL библиотека в одном модуле). AutoItX3 позволяет добавлять уникальные возможности AutoIt в написанные Вами приложения на других языках программирования!

И, наконец, самым знаменательным является тот факт, что AutoIt остался бесплатным. Однако, если Вы имеете возможность поддержать этот проект ценой собственного времени, деньгами или иными усилиями, то все виды пожертвований принимаются на домашней странице AutoIt.
Oszone AutoIt FAQ

Читайте руководство к AutoIt - многое прояснится :) Нижеизложенное - это что-то вроде краткой справки и FAQ по совместительству.
Запуск приложений
Обычный запуск 
Run('C:\Program Files\RivaTuner\RivaTuner.exe')
;или так:
FileChangeDir('C:\Program Files\RivaTuner\')
Run('RivaTuner.exe') 
Для универсализации скриптов используйте макросы, например, вместо "C:\Program Files" гораздо практичнее использовать макрос @ProgramFilesDir. Тогда команда запуска приложения будет выглядеть так: 
Run(@ProgramFilesDir & '\RivaTuner\RivaTuner.exe') 

Полный список макросов смотрите в разделе руководства "Macro Reference".
С ожиданием завершения (удобен для тихой установки приложений) 
RunWait('RivaTuner20RC158.exe /s') 
Обратите внимание на то, что первым аргументом функций Run и RunWait является ПОЛНЫЙ путь к исполняемому файлу. Писать одно имя можно только в двух случаях - если скрипт находится в том же каталоге или после предварительной смены рабочего каталога с пом. ф-ции FileChangeDir.
Системные переменные
В принципе, макросы дублируют большинство системных переменных, но не все. Добраться напрямую к их значениям можно с пом. ф-ции EnvGet, например: 
EnvGet("SYSTEMDRIVE") 
Дописывание пути в переменную Path: 
;например, допишем путь к 7-Zip в Path
$addtopath='%ProgramFiles%\7-Zip'
$smcur='HKEY_LOCAL_MACHINE\SYSTEM\ControlSet' & StringFormat("%03s",RegRead("HKEY_LOCAL_MACHINE\SYSTEM\Select","Current")) & '\Control\Session Manager\Environment'
$syscurpath=RegRead($smcur,"Path")
;если путь уже был внесен в Path (например, при установке поверх более старой версии), то ничего не делаем
If Not StringInStr ($syscurpath,@ProgramFilesDir&'\7-Zip') and Not StringInStr ($syscurpath,$addtopath) Then
RegWrite($smcur,"Path","REG_EXPAND_SZ",RegRead($smcur,"Path") & ";" & $addtopath)
EndIf
Если верить руководству AutoIt, то применение ф-ции EnvUpdate() после внесения изменений в переменную Path должно сделать доступным новые пути, но, на практике этого не происходит - для вступления изменений в силу требуется перезагрузить ОС.
Создание новой системной переменной: 
;имя создаваемой переменной
$newsysvarname='new'
;тип переменной
$newsysvartype='REG_SZ'
;значение переменной
$newsysvarvalue='value'
$smcur='HKEY_LOCAL_MACHINE\SYSTEM\ControlSet' & StringFormat("%03s",RegRead("HKEY_LOCAL_MACHINE\SYSTEM\Select","Current")) & '\Control\Session Manager\Environment'
RegWrite($smcur,$newsysvarname,$newsysvartype,$newsysvarvalue) 

Создать сист. переменную также можно используя ф-цию EnvSet("envvariable"[,"value"]), но она будет существовать только до выхода из текущего скрипта.
Ввод данных / работа с элементами управления
Посылка символов в активный элемент активного окна 
;дожидаемся активности окна RivaTuner с текстом Choose Install Location
WinWaitActive('RivaTuner','Choose Install Location')
;изменение пути уcтановки RivaTuner со стандартного на @ProgramFilesDir&'\RivaTuner'
Send(@ProgramFilesDir & '\RivaTuner') 
Посылка символов непосредственно в текстовое поле 
ControlSetText('RivaTuner','Choose Install Location','Edit1',@ProgramFilesDir & '\RivaTuner')
;или
ControlSend('RivaTuner','Choose Install Location','Edit1',@ProgramFilesDir & '\RivaTuner') 
Каракули вместо русских буковок

Проверьте, чтобы текстовый файлик скрипта (au3) был в ANSI (Win-1251) кодировке.
Клацанье по кнопкам, чекбоксам, выбор строки комбобокса и т.п. 
;нажать кнопку Button4, в окне установки Winamp, содержащем текст Interface and Skin Selection
ControlClick('Winamp','Interface and Skin Selection','Button4')
;выбрать radiobutton с текстом I &accept the agreement, в окне установки Everest, содержащем текст License Agreement
ControlCommand('Setup','License Agreement','I &accept the agreement','Check','')
;выбрать строку Full Install из выпадающего списка ComboBox1 в окне установки FLY 2000 TV, содержащем текст Выберите тип установки
ControlCommand('FLY 2000 TV','Выберите тип установки','ComboBox1','SelectString','Full Install')
Как кликнуть по скрытой кнопке (Control is hidden)

По идее, сначала нужно эту кнопку сделать видимой - ControlShow("title","text",controlID), но, довольно часто после применения этой ф-ции, клик на кнопке при помощи ControlClick("title","text",controlID) не проходит. В этом сл., спасением станет MouseClick("left",x,y,1).

Как точно попасть MouseClick-ом в нужную кнопку не зная разрешения экрана.
При написании скрипта используйте привязку координат к клиентской части активного окна. Т.е., когда Вы (используя "AutoIt Window Info") смотрите координаты кнопки, выставьте Options -> Coord Mode -> Client. А в скрипте (перед MouseClock-ом) задайте: 
; 1 - привязка к левому верхнему углу экрана (по ум.)
; 0 - привязка к активному окну
; 2 - привязка к клиентской части активного окна (все то, что ниже заголовка)
Opt("MouseCoordMode",2) 
Имя эл-та управления может изменяться от запуска к запуску программы (скажем, был "Button3", а в след раз стал "Button2") - имейте это ввиду. Решением в подобных ситуациях может стать обращение к эл-ту управления по его содержимому (Text), а не имени класса (ClassNameNN) или ControlID. 
;фрагмент информационного окна AutoIt Window Info:
Control ID: 1
ClassNameNN: Button2
Text: &Next > 
Ну, а если Вы предварительно убедитесь в активности окна с пом. WinWaitActive, то нажать на кнопку по умолчанию всегда можно банальным Send('{ENTER}'). Т.e. клацнуть по этому батону :) можно 4 способами: 
ControlClick('HyperSnap','',1)
ControlClick('HyperSnap','','Button2')
ControlClick('HyperSnap','','&Next >')
Send('{ENTER}') 
Есть еще один способ - через указатели, но для получения указателя все равно сначала нужно идентифицировать эл-т управления по одному из трех признаков.
Работа с ini-файлами
У AutoIt-а есть пять ф-ций для этих целей:

IniDelete("filename","section"[,"key"]) - удалить секцию или значение из ini-файла.
IniRead("filename","section","key","default") - считать значение из ini-файла.
IniReadSection("filename","section") - считать все пары секция/значение из ini-файла.
IniReadSectionNames("filename") - считать имена всех секций из ini-файла.
IniWrite("filename","section","key","value") - записать значение в ini-файл.
Пример использования: 
;Winamp - отключить автообновление и отправку статистики на сервер программы
IniWrite(@ProgramFilesDir & '\winamp\winamp.ini','Winamp','newverchk','0')
IniWrite(@ProgramFilesDir & '\winamp\winamp.ini','Winamp','newverchk2','0') 
Импорт данных из reg-файла в реестр
С помощью функции RunWait и штатной утилиты regedit.exe 
;для избавления от лишней головной боли лучше указывать полный путь к reg-файлу
;в данном примере, макрос @ScriptDir говорит о том, что reg-файл находится в одном каталоге со скриптом
;флаг @SW_HIDE заставит ф-цию RunWait отработать в скрытом окне
RunWait('regedit /S ' & @ScriptDir & '\рег-файл.reg','',@SW_HIDE) 
Внесение в реестр одиночных настроек (ф-ции RegWrite, RegDelete) 
;отключение информационного окна в кодеке DivX
RegWrite("HKEY_CURRENT_USER\Software\DivXNetworks\DivX4Windows","Disable feedback","REG_DWORD",0x00000001)
;регистрация WinAmp-а
RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Nullsoft\Winamp", "regname", "REG_SZ", "xxxxxxxxxxxxx")
RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Nullsoft\Winamp", "regkey", "REG_SZ", "xxxxxxxxxxxxxxxxxxxxxxxx")
;удаление WinampAgent-а из автостарта
RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "WinampAgent") 
Предотвращение возможности множественного запуска скрипта

В начало скрипта добавьте такие строки:
If WinExists(@ScriptName) Then Exit
AutoItWinSetTitle(@ScriptName) 
Отлов "случайных" окон
Если место появления окна известно 
;ждем не более 2 секунд. Будет окно - отработаем с ним, нет - просто пойдем дальше
If WinWait("Installer Language","",2) Then
WinActivate("Installer Language")
WinWaitActive("Installer Language")
Send("{ENTER}")
EndIf 
Если момент появления окна известен 
If WinExists('Регистрация FineReader 7.0','Пожалуйста') Then
WinActivate('Регистрация FineReader 7.0','Пожалуйста')
Send('{SPACE}')
ControlClick('Регистрация FineReader 7.0','Пожалуйста','Button4')
WinWaitActive('Регистрация','Внимание!')
Send('{ENTER}')
EndIf 
Если ничего не известно. 
;на протяжении выполнения тела скрипта каждые 500 мс (по ум. 250) будет выполняться ф-ция wfp
AdlibEnable("wfp",500)
...
;тело скрипта

...
Func wfp()
If WinExists('Защита файлов Windows','Файлы') Then
  ControlClick('Защита файлов Windows','Файлы','Button3')
  WinWait('Защита файлов Windows','Вы отказались')
  ControlClick('Защита файлов Windows','Вы отказались','Button1')
EndIf
EndFunc

Действующий пример использования AdlibEnable (а также вызова своей ф-ции при выходе из скрипта Opt("OnExitFunc","MyExit")) можете посмотреть в моем скрипте для установки переводчика Pragma.
Окно браузера (многие инсталляторы открывают домашнюю страницу по завершении установки) 
;достаем из реестра имя исполняемого файла браузера по умолчанию
$defaultbrowser = RegRead ('HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet','')
;ждем процесс браузера (проверка на наличие процесса в памяти производится каждые 250 мс
;на практике это означает, что окно браузера даже не успеет появиться)
ProcessWait ( $defaultbrowser )
;закрываем процесс браузера
ProcessClose ( $defaultbrowser )
;дожидаемся момента полной выгрузки процесса браузера из памяти (это не обязательно)
ProcessWaitClose ( $defaultbrowser ) 
Отлов ошибок
Для начала проверьте правильность синтаксиса и кодировку au3-файла. Для проверки синтаксиса удобно использовать специальные редакторы - мне нравится SciTE (Ctrl+F5 - проверка синтаксиса, F4 - переход к след. ошибке).
Если Ваш скрипт где-то, непонятно почему зависает, то посмотреть что его так озадачило можно так:
Добавляем в начало скрипта строку Opt("TrayIconDebug",1) и убираем строку Opt("TrayIconHide",1) конечно, если она есть.
Запускаем скрипт и, когда он застрянет, лезем мышкой к иконке АвтоИт-а в трэе и не нажимаем клавиш. Появится всплывающая подсказка, состоящая из 2 строк - в первой будет имя скрипта, а во второй строка на к-рой он застопорился (что-то вроде Line 5: WinWait("Name","Text")) Причем лучше запускать au3-файл, т.к. в случае с exe (откомпилированный скрипт) не будет показан номер строки.
Как с помощью AutoIt сменить раскладку клавиатуры
WinAPI-метод (предложил ANGRO) 
Run("notepad.exe")
Sleep(500)
;установка режима поиска окон по указателям (Advanced mode)
Opt("WinTitleMatchMode",4)
;получение указателя (уникального идентификатора) окна с именем класса "Notepad" и запись его в переменную $hWnd
$hWnd = WinGetHandle("classname=Notepad")
;переключение раскладки в окне, определяемом указателем $hWnd
_SetKeyboardLayout("00000409", $hWnd)

Func _SetKeyboardLayout($sLayoutID, $hWnd)
Local $WM_INPUTLANGCHANGEREQUEST = 0x50
Local $ret = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", $sLayoutID, "int", 0)
DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $hWnd, "int", $WM_INPUTLANGCHANGEREQUEST, "int", 1, "int", $ret[0])
EndFunc
Exit
#cs
Дополнительные языки.

"00000407" Немецкий (стандартный)
"00000409" Английский (США)
"0000040C" Французский (стандартный)
"0000040D" Финский
"00000410" Итальянский
"00000415" Польский
"00000419" Русский
"00000422" Украинский
"00000423" Белорусский
"00000425" Эстонский
"00000426" Латвийский
"00000427" Литовский
#ce
Реестровый метод (Sanja Alone) 
;клавиши (разрешенные клавиши: 1,2,3,4,5,6,7,8,9,0,~,Ё - знак ударения)
$vrtkey='1,2,3'
;модификаторы клавиш (разрешены: '05' - Ctrl; '06' - Alt)
$keymod='05,05,06'
;коды языков (можете посмотреть в разделе "Appendix" руководства по AutoIt или в вышеприведенном примере)
$lang='0409,0419,0422'
;включаем возможность раздельного переключения языков (англ. - Ctrl+Shift+1; рус. - Ctrl+Shift+2; укр. - Alt+Shift+3)
_EnableLangSwitching($vrtkey,$keymod,$lang)
;----- пример кода -----
Run("notepad.exe")
Sleep(500)
;переключение на англ.
Send('^+1')
Send('Hello, World'&@LF)
;переключение на рус.
Send('^+2')
Send('Привет, Мир'&@LF)
;переключение на укр.
Send('!+3')
Send('Привўт, Свўте'&@LF)
;переключение на англ.
Send('^+1')
Send('Hello, New World'&@LF)
;------------------

;отключение возможности раздельного переключения языков (удаление из реестра внесенных туда веток)
;в кач-ве аргумента укажите к-во языков, заданное выше в переменной $lang (для данного примера. - 3)
_DisableLangSwitching(3)

Func _EnableLangSwitching($key,$mod,$lng)
$constpart="HKEY_CURRENT_USER\Control Panel\Input Method\Hot Keys\000001"
$akey=StringSplit($key,',',1)
$amod=StringSplit($mod,',',1)
$alng=StringSplit($lng,',',1)
If UBound($akey,1)=UBound($amod,1) and UBound($akey,1)=UBound($alng,1) Then
  For $i=1 To UBound($alng,1)-1
  RunWait('REG ADD "' & $constpart & StringFormat('%02s"',$i-1) & ' /v "Virtual Key" /t REG_BINARY /d ' & Hex(Asc($akey[$i]),2) & '000000 /f','',@SW_HIDE)
  RunWait('REG ADD "' & $constpart & StringFormat('%02s"',$i-1) & ' /v "Key Modifiers" /t REG_BINARY /d ' & $amod[$i] & 'c00000 /f','',@SW_HIDE)
  RunWait('REG ADD "' & $constpart & StringFormat('%02s"',$i-1) & ' /v "Target IME" /t REG_BINARY /d ' & StringRight($alng[$i],2)&StringLeft($alng[$i],2)&StringRight($alng[$i],2)&StringLeft($alng[$i],2) & ' /f','',@SW_HIDE)
  Next
  SetError(0)
  Return(1)
Else
  SetError(1)
  Return(0)
EndIf
EndFunc

Func _DisableLangSwitching($count)
$constpart="HKEY_CURRENT_USER\Control Panel\Input Method\Hot Keys\000001"
For $i=0 To $count-1
  RunWait('REG DELETE "' & $constpart & StringFormat('%02s"',$i) & ' /f','',@SW_HIDE)
Next
EndFunc
Полезные ссылки

Категория: Мои статьи | Добавил: zanoga (01.09.2009)
Просмотров: 12143 | Рейтинг: 5.0/1 |
Всего комментариев: 0
Имя *:
Email *:
Код *:
Форма входа
Поиск
Линки

IP: 13.59.183.186
Браузер:


Locations of visitors to this page
Я Професіонал
Copyright Zanoga Alex © 2024