Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также любые проблемы программирования на различных макроязыках и в скриптовых средах)

Скриптовый язык AutoIT

Скриптовый язык AutoIt - это бесплатный мощный язык для написания сценариев для Windows 2000, XP, 2003, Vista, Server 2008 (для машин с 32 и 64-разрядным процессором) с упором на автоматизацию GUI, который можно применять для решения широкого спектра задач, начиная от автоматизации рутинных операций и заканчивая созданием сложных приложений. Синтаксис AutoIt — бейсикоподобный, поэтому язык достаточно прост в изучении. Сам AutoIt создан на языке Cи и достаточно нетребователен к ресурсам компьютера. Основной автор и разработчик проекта AutoIt — Jonathan Bennet. Взять язык можно здесь. Подробный протокол развития AutoIt можно увидеть здесь. Русскую справку (подробный файл CHM) можно скачать здесь.

Основные возможности языка:

Hello, World!

Файлы скриптов имеют расширение .au3. Запуск осуществляется командой наподобие следующей:

<путь>\AutoIt3.exe скрипт.au3

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

Простейший скрипт:

; комментарий
MsgBox(0, "Заголовок окна", "Привет, AutoIt!")

Скрипт выше выведет диалоговое окно с приветствием. Первый аргумент функции MsgBox определяет тип сообщения (в данном случае — окно с единственной кнопкой ОК, без дополнительных опций).

Можно исполнить код на языке AutoIt динамически, из командной строки, например:

AutoIt3.exe /AutoIt3ExecuteLine "MsgBox(0, 'Hello World!', 'Привет!')"

Следующий пример демонстрирует возможность автоматизации произвольных GUI-приложений:

Run("notepad.exe") ; запускаем Блокнот
WinWaitActive("Безымянный - Блокнот") ; ожидаем появление окна Блокнота
Send("Какой-то текст.") ; посылаем нажатия (имитируем ввод)
WinClose("Безымянный - Блокнот") ; посылаем окну команду закрытия
; ожидаем появление окна запроса о сохранении:
WinWaitActive("Блокнот", "Текст в файле Безымянный был изменен.")
Send("{ESC}") ; посылаем нажатие Escape (имитируем ввод)

Скрипт выше запускает Блокнот, печатает в него текст, посылает окну Блокнота команду закрытия, а затем отказывается от закрытия, посылая нажатие Escape окну запроса о сохранении. Эти приёмы демонстрируют возможность автоматизации произвольных приложений, даже тех, которые не поддерживают опций командной строки или специальных программных средств автоматизации. AutoIt просто имитирует пользовательский ввод. Такие возможности скриптового языка могут стать спасательным кругом для решения многих проблем, например, автоматической инсталляции некоторых приложений.

Следующий пример демонстрирует назначение глобальных горячих клавиш:

; установка глобального перехвата нажатия клавиши Escape:
HotKeySet("{ESC}", "Terminate")
; установка глобального перехвата нажатия комбинации клавиш Alt+Shift+1
HotKeySet("+!1", "ShowMessage")
; тело основной программы
While 1
    Sleep(100)
WEnd

; функции
Func Terminate() ; по нажатию клавиши Escape
    Exit 0 ; завершение работы
EndFunc

Func ShowMessage() ; по нажатию комбинации клавиш Alt+Shift+1
    MsgBox(4096, "", "Вы нажали Alt+Shift+1.")
EndFunc

Скрипт выше устанавливает глобальный перехват нажатий Escape и Alt+Shift+1 (после запуска в трее появится иконка скрипта). При нажатии Alt+Shift+1 выдаётся сообщение, а при нажатии Escape скрипт завершает работу (активное окно в момент нажатий не имеет значения — перехват глобальный). Эти приёмы позволяют сильно автоматизировать работу пользователя. На нажатие различных клавиш можно "повесить" запуск приложений или выполнение определённых действий в нужном приложении т.п.

Синтаксис работы с COM-объектами прозрачен, как и в большинстве бейсикоподобных языков:

$wsh = ObjCreate("WScript.Shell") ; создание объекта
if @error then exit(1) ; проверка ошибки
$wsh.popup("сообщение") ; вызов метода

Скрипт выше выдаст окно с текстом "сообщение".

Инструменты в поставке

После установки AutoIt вам будут доступны следующие основные инструменты:

Примечания:

Другие примеры работы

Следующий пример демонстрирует использование Win32 API и организацию callback (функции обратного вызова), а также использование встроенных возможностей для получения информации об окнах (функции WinGetTitle и WinGetState):

;Создание функции обратного вызова
$handle = DLLCallbackRegister('_EnumWindowsProc', 'int', 'hwnd;lparam')
;Вызвать API для перебора окон
DllCall('user32.dll', 'int', 'EnumWindows', 'ptr', DllCallbackGetPtr($handle), 'lparam', 10)
;Освободить функцию обратного вызова
DllCallbackFree($handle)

;Функция обратного вызова
Func _EnumWindowsProc($hWnd, $lParam)
   If WinGetTitle($hWnd) <> '' And BitAnd(WinGetState($hWnd), 2) Then
      $res = MsgBox(1, WinGetTitle($hWnd), _
                    '$hWnd=' & $hWnd & @CRLF & _
                    'lParam=' & $lParam & @CRLF & _
                    '$hWnd(type)=' & VarGetType($hWnd))
      If $res=2 Then Return 0 ;Нажатие кнопки "Отмена" останавливает дальнейший перебор окон
   EndIf
   Return 1 ;Продолжить перебор окон
EndFunc

Пример выше выведет информацию об открытых и в данный момент видимых окнах в системе, демонстрируя информацию о каждом окне отдельным сообщением. Нажатие кнопки "Отмена" в любой момент останавливает дальнейший перебор окон.

Следующий пример демонстрирует работу со структурами Win32 API, а также элементы построения GUI (окно выбора файла):

;Открытие файла библиотеки значков
$sFileName = FileOpenDialog('Выберите файл, содержащий значки', _
                            @SystemDir , 'Файлы значков(*.dll;*.ocx)', _
                            1, 'SHELL32.DLL')
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$stIcon = DllStructCreate('int') ;Структура для номера иконки
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;преобразование строки имени файла в Unicode
$nBuffersize = DllCall('KERNEL32.DLL', _
                       'int','MultiByteToWideChar', _
                       'int', 0, _
                       'int', 0x00000001, _
                       'str', $sFileName, _
                       'int', -1, _
                       'ptr', 0, _
                       'int', 0)
$stString = DLLStructCreate("byte[" & 2 * $nBuffersize[0] & "]")
DllCall('KERNEL32.DLL', _
        'int', 'MultiByteToWideChar', _
        'int', 0, _
        'int', 0x00000001, _
        'str', $sFileName, _
        'int', -1, _
        'ptr', DllStructGetPtr($stString), _
        'int', $nBuffersize[0])
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;Вызов функции диалога выбора значков
DllCall('SHELL32.DLL', _
        'none', 62, _
        'hwnd', 0, _
        'ptr', DllStructGetPtr($stString), _
        'int', DllStructGetSize($stString), _
        'ptr', DllStructGetPtr($stIcon))
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;обратное преобразование строки имени файла в однобайтную кодировку
$nBuffersize = DllCall('KERNEL32.DLL', _
                       'int', 'WideCharToMultiByte', _
                       'int', 0, _
                       'int', 0x00000200, _
                       'ptr', DllStructGetPtr($stString), _
                       'int', -1, _
                       'ptr', 0, _
                       'int', 0, _
                       'ptr', 0, _
                       'ptr', 0)
$stFile = DLLStructCreate('char[' & $nBuffersize[0] & ']')
DllCall('KERNEL32.DLL', _
        'int', 'WideCharToMultiByte', _
        'int', 0, _
        'int', 0x00000200, _
        'ptr', DllStructGetPtr($stString), _
        'int', -1, _
        'ptr', DllStructGetPtr($stFile), _
        'int', $nBuffersize[0], _
        'ptr', 0, _
        'ptr', 0)
$sFileName = DllStructGetData($stFile, 1)
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$nIconIndex = DllStructGetData($stIcon, 1) ;Получение номера иконки
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;Контрольное сообщение
Msgbox(262192, 'Info', _
       'Выбран файл: ' & $sFileName & @CR & _
       'Иконка: ' & $nIconIndex)
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$stBuffer = 0
$stFile   = 0
$stIcon   = 0

Скрипт выше выведет диалог открытия файла, затем диалог выбора иконки, а затем продемонстрирует номер выбранной иконки.

Ещё один пример работы со структурами Win32 API:

$startColor = 0xff0000
Const $WM_INITDIALOG            = 0x0110 
Const $CC_ANYCOLOR              = 0x100
Const $CC_RGBINIT               = 0x1
Const $CC_FULLOPEN              = 0x2
Const $CC_PREVENTFULLOPEN       = 0x4
Const $CC_SHOWHELP              = 0x8
Const $CC_ENABLEHOOK            = 0x10
Const $CC_ENABLETEMPLATE        = 0x20
Const $CC_ENABLETEMPLATEHANDLE  = 0x40
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;Создание структуры CHOOSECOLOR
$CHOOSECOLOR = DllStructCreate( _
    'dword;' & _ ;Размер структуры, байт
    'int;'   & _ ;Дескриптор окна породившего диалог
    'int;'   & _ ;Хэндл участка памяти содержащего шаблон
    'int;'   & _ ;Начальный цвет, отсюда же происходит возврат выбранного цвета
    'ptr;'   & _ ;Указатель на 16 элементный массив палитры
    'dword;' & _ ;Комбинация флагов
    'int;'   & _ ;Данные процедуры-фильтра
    'ptr;'   & _ ;Указатель на процедуру фильтр
    'ptr')       ;Указатель на строку-имя шаблона диалога
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;Создание структуры набора цветов
$template = ''
for $i=1 to 16
    $template=$template & "int;"
next
$template = StringTrimRight($template, 1)
Local $palette = DllStructCreate($template)
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;Заполнение структуры набора цветов
DllStructSetData($palette, 1, $startColor)
for $i=2 to 16
    DllStructSetData($palette, $i, 0xffffff)
next
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;Заполнение структуры CHOOSECOLOR
DllStructSetData($CHOOSECOLOR, 1, DllStructGetSize($CHOOSECOLOR))
DllStructSetData($CHOOSECOLOR, 2, 0)
DllStructSetData($CHOOSECOLOR, 4, $startColor)
DllStructSetData($CHOOSECOLOR, 5, DllStructGetPtr($palette))
DllStructSetData($CHOOSECOLOR, 6, BitOR($CC_ANYCOLOR, $CC_FULLOPEN, $CC_RGBINIT))
DllStructSetData($CHOOSECOLOR, 7, $WM_INITDIALOG)
DllStructSetData($CHOOSECOLOR, 8, "CCHookProc")
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;Вызов диалога
$result = DllCall('comdlg32.dll', 'long', 'ChooseColor', _
                  'ptr', DllStructGetPtr($CHOOSECOLOR))
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;Выделение компонент цвета
if not $result[0] then return -1
    $color = DllStructGetData($CHOOSECOLOR, 4)
    $color = hex($color)
    $blue = StringMid ($color,3,2)
    $green = StringMid ($color,5,2)
    $red = StringMid ($color,7,2)
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;Контрольное сообщение
msgbox(64, "Выбранный цвет", _
       "Красный: " & dec($red)        & @CRLF & _
       "Зеленый: " & dec($green)    & @CRLF & _
       "Синий: "   & dec($blue))
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$CHOOSECOLOR = 0
$palette = 0

Скрипт выше выводит стандартный диалог выбора цвета, а затем демонстрирует выбранные компоненты цвета.

Ещё один пример работы со структурами Win32 API:

$volStr = DllStructCreate('char[255];char[255];udword;udword;udword')
$result = DllCall('KERNEL32.dll', _
          'long', 'GetVolumeInformationA', _
          'str',  'C:\', _
          'str',  DllStructGetPtr($volStr, 1), _
          'long', 255, _
          'long', DllStructGetPtr($volStr, 3), _
          'long', DllStructGetPtr($volStr, 4), _
          'long', DllStructGetPtr($volStr, 5), _
          'str',  DllStructGetPtr($volStr, 2), _
          'long', 255)
MsgBox(262192, 'Информация о диске', _
       'Метка тома: '         & $result[2] & @CR & _
       'Серийный номер: '     & DllStructGetData($volStr, 3) & @CR & _
       'Файловая структура: ' & $result[7])

Скрипт выше выводит информацию о диске C: (метку тома, серийный номер и файловую структуру).


Возможно написание консольных скриптов (AutoIt умеет работать с консолью напрямую). Однако, пока скрипт не будет явно скомпилирован как консольный, утилитой %ProgramFiles%\AutoIt3\Aut2Exe\Aut2exe.exe (с флажком "Console?" в интерактивном режиме или параметром /console в пакетном режиме работы утилиты), такой скрипт не будет наследовать окно консоли родительского процесса (например, окно консоли cmd.exe), а будет работать со своей консолью. Поэтому в родительском окне того же cmd.exe организовать какой-либо ввод/вывод будет нельзя. Для того, чтобы увидеть результат работы скрипта в окне консоли, скрипт должен быть явно скомпилирован как консольный. Тем не менее, разницы в программном доступе, независимо от того, скомпилирован ли скрипт как GUI или консольное приложение, нет. Пример консольного скрипта:

; Вывод на консоль (используется Stdout, стандартный дескриптор 1):
ConsoleWrite("Output to console" & @CRLF)
; Вывод на консоль (используется Stderr, стандартный дескриптор 2): 
ConsoleWriteError("Output error to console" & @CRLF)
; Ввод с консоли (используется Stdin, стандартный дескриптор 0): 
$strValue = ConsoleRead()
ConsoleWrite("Byte read: [" & @extended & "]; Value: [" & $strValue & "]" & @CRLF)

Если скомпилировать вышеприведённый скрипт как консольное приложение test.exe, его вывод будет отображаться, и можно передать ему данные, например, такой командой:

test.exe < test.txt

В любом случае, с подобным скриптом можно будет работать в командной строке примерно таким способом:

autoit3 test.au3 < test.txt 1>StdOut.txt 2>StdErr.txt

В набор пользовательских функций (UDF — User Defined Function) входит библиотека WinAPI.au3, в которой присутствуют функции:

Ну, и, конечно, через встроенную функцию DllCall() можно использовать функции Win API по работе с консолью.


Примеры построения GUI вы можете найти в каталоге \Examples\GUI установки AutoIt, а здесь — несколько скриншотов:




Программа Depo, написанная на AutoIt, которую вы можете взять здесь:




Программа Анализ гиперссылок, написанная на AutoIt:




Примечание: AutoIt поддерживает пользовательские (сторонние) элементы управления, поставляемые как ActiveX. Пример использования вы можете посмотреть в справке, в статье о функции GUICtrlCreateObj.

Людоговский Александр, 20.01.2009г.
Благодарность за помощь в написании статьи — alexii и Poltergeyst.

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.