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

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

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

Основные возможности языка: 
работа со строками, математические функции, регулярные выражения, поддержка Unicode, встроенные макропеременные, содержащие системную информацию "только для чтения"; инструкция #include для подключения библиотек; работа с файловой системой и текстовыми файлами; обработка параметров командной строки; анализ и преобразование типов переменных;
имитация пользовательского ввода мышью и клавиатурой в любых приложениях;
манипуляция окнами запущенных приложений (получение информации и управление);
глобальные перехватчики клавиатуры, запуск процедур по нажатию горячих клавиш;
компиляция в исполняемые exe-модули;
построение GUI; основные элементы управления, а также пользовательские элементы управления, поставляемые как ActiveX; рисование графических примитивов; работа с треем; стандартные диалоги выбора файла и обзора каталогов;
поддержка COM с возможностью обработки событий;
вызов экспортируемых функций DLL (например, Win32 API), включая callback; работа с API структурами данных;
библиотека AutoItX3.dll — ActiveX компонент, позволяющий использовать некоторые возможности AutoIt на произвольном языке программирования через интерфейсы DLL и ActiveX/COM;
работа с сетью (протоколы TCP и UDP, загрузка файлов);
мониторинг и запуск процессов; запуск процессов от имени указанной учётной записи;
работа с реестром;
работа с буфером обмена;
проигрывание wav, mp3, avi файлов;
поддержка User Account Control (UAC) в Windows Vista.
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 вам будут доступны следующие основные инструменты: 
утилита Aut2exe.exe для создания исполняемых exe-модулей; позволяет компилировать скрипты как консольные и как GUI-приложения;
утилита AU3Info.exe для отслеживания различных характеристик окон под курсором мыши, важный инструмент написания скриптов для управления окнами;
AutoIt.chm — основной файл документации (англ.), использующий файлы AutoIt3.chm и UDFs3.chm; документация обширна и подробна;
в каталоге \Include содержится свыше 80 готовых скриптов для подключения их директивой #include; это библиотеки пользовательских функций (UDF — User Defined Function), созданных энтузиастами AutoIt, которые можно использовать в любом скрипте; все эти функции документированы в файле справки, таких функций более двухсот пятидесяти;
в каталоге \Examples содержится свыше двух тысяч примеров скриптов; подавляющее большинство из них является составной частью файла справки (каталог \Examples\Helpfile);

Примечания: 
для версий AutoIt, более ранних, чем версия на момент написания данной статьи, работает утилита Exe2Aut.exe для обратной декомпиляции ранее откомпилированных скриптов (на декомпиляцию может быть установлен пароль);
версии AutoIt, более ранние, чем версия на момент написания данной статьи, поддерживают версии Windows 9x.
Другие примеры работы

Следующий пример демонстрирует использование 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: (метку тома, серийный номер и файловую структуру).

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

IP: 18.216.89.144
Браузер:


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