Учебник по autoit 36

В интернете существует запрос на учебник по autoit.Я хочу попытаться в некотором роде восполнить этот запрос.
Программирование на бейсике  начинается с объявления переменной.Переменная - это область памяти,из которой можно либо считывать информации либо перезаписывать информацию.В большинстве случаев такой информацией являются целые числа,так как компьютер заточен на работу именно с числовыми данными.Хотя autoit  и поддерживает строковые данные,но на самом деле в компьютере они представляются в виде определенных чисел,каждому символу соответствует свой числовой код.Поэтому становится тривиальной задачей сравнивать символ с символом на равенство и неравенство - на компьютере это представляет собой сравнивание одного целого числа с другим.
Чтобы начать писать программы на autoit необходимо научиться работать с текстовыми файлами в операционной системе,ибо программа это ничто иное,как текстовый файл.
Набрав текст программы - его сохраняют на жесткий диск с расширением au3 - любой файл программы на autoit должен заканчиваться этим расширением.Обычно в контекстном меню рабочего стола в разделе - Создать - можно выбрать пункт - AutoIt v3 Script,который создаёт файл с именем AutoIt v3 Script.au3.Само имя файла потом можно сменить.Если программа является однофайловой,то не имеет значение,какое имя у неё.

Выше я уже поднимал вопрос по переменным.Теперь продолжим изучение этого предмета при программировании на бейсике.
В autoit существует два оператора объявления переменных Local и Global.
Local используется,как легко понять из названия самого оператора, для объявления локальных переменных.Global используется для объявления глобальных переменных.Обычно локальные переменные определяются в какой-либо отдельной функции и только в ней и существуют.
Вообще локальные и глобальные переменные является основными объектами,которые используются при построении программ любой сложности,их достаточно для любых мыслимых нужд программирования.

Следующим важным шагом в овладении программированием на autoit являются функции.Функции - это по сути отдельная подпрограмма и может многократно вызываться для выполнения своего кода,хотя и располагается в одном определённом месте потока выполнения.

Каждая функция имеет имя,по которому программисту её нужно вызывать.Синтаксис функции выглядит так:
func имя функции
здесь инструкции
endfunc

Чтобы вызвать функцию необходимо набрать её имя и поставить круглые скобки,как открывающую,так и закрывающую.
Также функция может получать параметры через запятую.Параметры назначаются в круглых скобках.
Чтобы возвратить значение из функции используется оператор return.Когда функция возвращает значение,тогда прекращает своё выполнение и переходит в место своего вызова.

Вообще функции должны быть лаконичны и выполнять определенную задачу.Понятно,что задача может делать сразу множество действий,но навряд ли это правильный подход программирования.
Для вывода какой-либо информации на экран в autoit используется функция msgbox.
MsgBox(0, "Сообщение", "Привет,я программа autoit")
Для ввода информации подойдёт функция inputbox.
Local $result = inputbox("Вопрос","Как вас зовут?")
MsgBox(0, "", "привет "&$result)
Самый простой способ соединения строк в autoit является использование знака амперсанда,что и отражено в предыдущем исходнике.

Важной темой в программировании является оператор ветвления,который позволяет выполнять какие-либо действия по определенному условию.
Самым простым ветвлением в autoit является конструкция if then endif.
Использовать эту конструкцию можно так:

Local $result = inputbox("Вопрос","Как зовут твою кошку ?")
if $result = "Муся" then
MsgBox(0, "", "Муся - " & "это хорошее имя для кошки ")
endif

Вторым важным вариантов ветвления является if then else endif.

Local $result = inputbox("Вопрос","Как зовут твою кошку ?")
if $result = "Муся" then
MsgBox(0, "", "Муся - " & "это хорошее имя для кошки ")
else
MsgBox(0, "", "Имя вашей  кошки не Муся ")
endif

Для выполнения множественного ветвления используется конструкция If ElseIf then Else EndIf.

Local $result = inputbox("Вопрос","Как зовут твою кошку ?")
if $result = "Муся" then
MsgBox(0, "", "Муся - " & "это хорошее имя для кошки ")
ElseIf $result = "Мурзик" then
MsgBox(0, "", "Имя вашей  кошки Мурзик ")
Else
MsgBox(0, "", "Имя вашей  кошки ни Муся ни Мурзик ")
endif
Всех перечисленных видов ветвления  вполне достаточно для программирования всевозможных условий в языке autoit.Но в нём существуют и другие операторы выбора.

В autoit существуют различные циклические конструкции для повторения инструкций.Первым оператором цикла рассмотрим for.
Часто цикл for используют вот так:
for $i = 0 to 10 step 1
MsgBox(0,"Сообщение","Номер итерации цикла " &$i)
next
Данная программа на autoit осуществляет вывод некоторого текстового сообщения 11 раз.
Следующим циклом для исследования будет while wend.Этот вид цикла позволяет выполняться инструкции бесконечное количество раз или использоваться,как цикл for.
Local $i = 10
While $i = 10
WEnd
Код выше  ничего не выводит и просто оставляет запущенную программу в системном трее и там находится до принудительного завершения пользователем.
Для выхода из цикла в autoit существует оператор ExitLoop.
while 1
Local $result = inputbox("Вопрос","Тебе больше 18 лет?","да")
if $result = "да" then ExitLoop
wend
При положительном ответе на вопрос программа завершит своё выполнение,в противном продолжит,так как цикл является бесконечным до тех пор,пока не получит утвердительный ответ пользователя.

Как в любом другом языке программирования в autoit имеются арифметические операторы - сложение(+),вычитание(-),умножение(*),деление(/).

Local $var1 = 10
Local $var2 = 10
msgbox(0,"Сложение",$var1+$var2)
msgbox(0,"Вычитание",$var1-$var2)
msgbox(0,"Умножение",$var1*$var2)
msgbox(0,"Деление",$var1/$var2)

Арифметические действия в autoit выполняются почти также,как в обычной школьной математике.

Логические операторы необходимы в autoit для составления различных условий,которые вычисляются и в соотвествии с ними выполняются или не выполняются некоторые участки кода.Такими операторами являются логическое И - and,логическое ИЛИ - or и логическое НЕ - not.Этих трёх логических операторов достаточно для формирования любых мыслимых программистом условий в программе на autoit.


Local $var1 = 5
Local $var2 = 10
if $var1 = 5 and $var2 = 10 then msgbox(0,"Сообщение","Переменные соответствуют заданному программистом начальному условию")

Более реалистичный пример - это определение входит ли введенное пользователем число в диапазон,который можно представить в программе,как условие с логическим оператором.

while 1
Local $result = inputbox("Сообщение","Введите целое число")
if $result >0 and $result < 10 then
msgbox(0,"Сообщение","Число входит в диапазон")
else
msgbox(0,"Сообщение","Число  не входит в диапазон")
endif
wend

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

Ниже показана программа,которая выводит на экран окно с кнопкой,которая  закрывает это окно.
#include <GUIConstantsEx.au3>

Local $hGUI = GUICreate("Первое графическое окно на autoit")
Local $idOK = GUICtrlCreateButton("закрыть окно", 310, 370, 85, 25)


GUISetState(@SW_SHOW, $hGUI)

While 1
if  GUIGetMsg() = $idOK then

ExitLoop
endif
WEnd

Функция GUICreate создаёт главное графическое окно.Функция GUISetState с параметром @SW_SHOW  показывает окно, дескриптор которого передаётся во втором параметре.
Функция GUIGetMsg() получает происходящее в окне событие.Сравнение дескриптора кнопки с возвращаемым значением от этой функции позволяет при помощи оператора ветвления if выполнить любой программный код,допустимый в autoit.

Вышеприведённая программа хороша,но имеет один минус - она не закрывается на крестик.Поэтому я привожу программу,которая лишена этого недостатка.

#include <GUIConstantsEx.au3>

Local $hGUI = GUICreate("Первое графическое окно на autoit")
Local $idOK = GUICtrlCreateButton("закрыть окно", 310, 370, 85, 25)


GUISetState(@SW_SHOW, $hGUI)

While 1

$msg = GUIGetMsg()
if $msg = $idOK then
ExitLoop
endif
if  $msg = $GUI_EVENT_CLOSE then
ExitLoop
endif

WEnd

Теперь событие от программы записывается в переменную $msg.

В autoit-программах часто используется инструкция #include.Она позволяет включать в текущий программный файл другой программный файл.Инструкция #include с угловыми скобками обычно ищет файл в директории C:\Program Files\AutoIt3\Include.
А вот инструкция #include с двойными кавычками требует полный путь к файлу.

По умолчанию autoit-программа показывает свою иконку в системном трее.Если нажать на эту иконку выпадает контекстное меню,которое позволяет  завершить исполняемый процесс.При необходимости отключить данную опцию - нужно в начале исходного кода написать инструкцию #NoTrayIcon.

Иногда необходимо выполнить проверку на согласия пользователя выйти из приложения.


#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>


Local $hGUI = GUICreate("")
Local $idExit = GUICtrlCreateButton("закрыть окно", 310, 370, 85, 25)


GUISetState(@SW_SHOW, $hGUI)

While 1

$msg = GUIGetMsg()
if $msg = $idExit then
ExitLoop
endif
if  $msg = $GUI_EVENT_CLOSE then

Local $result = MsgBox($MB_OKCANCEL, "Сообщение", "Вы действительно хотите закрыть приложение")

if $result = 1 then exitloop

endif

WEnd

Функция MsgBox возвращает определенное числовое значение,по которому autoit-программа определяет,какую кнопку нажал пользователь и в соответствии с этим выполнить какую-либо программную операцию.

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

Функция HotKeySet позволяет регистрировать клавишу,по которой выполняется какая-нибудь инструкция.

#include <GUIConstantsEx.au3>
HotKeySet ( "{ESC}", myexit)
Local $hGUI = GUICreate("")
GUISetState(@SW_SHOW, $hGUI)
func myexit()
Exit
endfunc
While 1
WEnd
Вышеприведенный пример вызывает функцию myexit при нажатии на клавишу escape пользователем autoit-программы на клавиатуре.

#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>


Local $hGUI = GUICreate("Окно выхода из windows")
Local $idExit = GUICtrlCreateButton("Завершить работу в windows", 0, 100, 400, 25)


GUISetState(@SW_SHOW, $hGUI)

While 1

$msg = GUIGetMsg()
if $msg = $idExit then
Local $result = MsgBox($MB_OKCANCEL, "Сообщение", "Вы действительно хотите завершить работу в windows")

if $result = 1 then Shutdown(1)

endif
if  $msg = $GUI_EVENT_CLOSE then
ExitLoop
endif

WEnd

Вполне возможно создать autoit-программу,которая имитирует поведение главного меню  windows,в котором выполняется переход в спящий режим,перезагрузка и завершение работы с операционной системой.

Функция GUICtrlRead позволяет считать информацию из текстового поля по его идентификатору.

#include <GUIConstantsEx.au3>
#include <Process.au3>

Local $hGUI = GUICreate("Запуск программы")

Local $nameLabel = GUICtrlCreateLabel("Имя программы",0,0)
Local $nameProgram = GUICtrlCreateInput("notepad",0, 25, 400, 20)
Local $idRun = GUICtrlCreateButton("Запустить программу", 0, 100, 400, 25)


GUISetState(@SW_SHOW, $hGUI)

While 1

$msg = GUIGetMsg()
if $msg = $idRun then
Run(GUICtrlRead($nameProgram), "", @SW_SHOWNORMAL)
endif
if  $msg = $GUI_EVENT_CLOSE then
ExitLoop
endif

WEnd

В данном случае идентификатор передаваемый в функцию GUICtrlRead это $nameProgram.Функция Run в соответствии с полученным текстом из текстового поля выполняет запуск программы,если она действительно существует.

#include <GUIConstantsEx.au3>

Local $hGUI = GUICreate("Разрешение экрана")

Local $Label_1 = GUICtrlCreateLabel("Ширина экрана",0,0)
Local $Label_2 = GUICtrlCreateLabel("",0,30,400,25)
Local $Label_3 = GUICtrlCreateLabel("Высота экрана",0,60)
Local $Label_4 = GUICtrlCreateLabel("",0,90,400,25)
Local $idRun = GUICtrlCreateButton("Получить разрешение", 0, 120, 400, 25)


GUISetState(@SW_SHOW, $hGUI)

While 1

$msg = GUIGetMsg()
if $msg = $idRun then
GUICtrlSetData($Label_2,@DesktopWidth)
GUICtrlSetData($Label_4,@DesktopHeight)
endif
if  $msg = $GUI_EVENT_CLOSE then
ExitLoop
endif

WEnd

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

Функция может возвращать числовое значение,которое потом можно использовать в autoit-программах.Это её свойство применяется в вышеприведенных исходниках в операторах ветвления if и там специальным образом обрабатывается.
Пользовательская функция имеет тело.Тело функции - это определённые инструкции на языке autoit.

Этот учебник слабоструктурирован и возможно имеет повторения некоторых технических подробностей.Но надо понимать,что такая работа приводится мной впервые и я стараюсь,чтобы данный учебник был максимально полезен начинающим программистам.


Run("notepad.exe")
while 1
Sleep(1000)
Send("Привет")
WEnd

Данная выше autoit-программа не очень интеллектальна,она просто вызывает программу блокнота с помощью функции Run и отправляет с помощью функции Send некоторый текст.

Run("notepad.exe")
while 1
Sleep(1000)
Send("Привет")
Send("{ENTER}")
WEnd

Функция Send вообще используется для имитации нажатия клавиш клавиатуры.
Send("{ENTER}") имитирует нажатие клавиши ввода ENTER.

#include <FileConstants.au3>
 Local $sValue = InputBox("Запуск программы", "Имя программы", "notepad")
 Run($sValue)
 if $sValue <> "" Then
Local $hFileOpen = FileOpen("Лог программы.txt", $FO_APPEND)
Local $stime = @HOUR & ":" & @MIN & ":" & @SEC & @CRLF
FileWrite($hFileOpen, "Программа Запуск программы запустилась в " & $stime)
FileClose($hFileOpen)
EndIf

В autoit-программе выше происходит запуск блокнота и записываетcя время  запуска.В переменной $stime формируется время запуска при помощи оператора конкатенации строк - амперсанда,а функция FileWrite производит запись информации в файл логирования.

#include <GUIConstantsEx.au3>

Local $hGUI = GUICreate("Запуск сайта")

Local $Label_1 = GUICtrlCreateLabel("Путь к браузеру",0,0)
Local $path_program = GUICtrlCreateInput("C:\Program Local $Label_2 = GUICtrlCreateLabel("Адрес открываемого сайта",0,60)
Local $url = GUICtrlCreateInput("google.ru",0,90,400,25)
Local $idRun = GUICtrlCreateButton("Запустить сайт в браузере", 0, 120, 400, 25)


GUISetState(@SW_SHOW, $hGUI)

While 1

$msg = GUIGetMsg()
if $msg = $idRun then

Run('"' & GUICtrlRead($path_program) & '"'  & GUICtrlRead($url))
endif
if  $msg = $GUI_EVENT_CLOSE then
ExitLoop
endif

WEnd

Данная выше autoit-программа позволяет запустить произвольный сайт в браузере chrome.Также надо понимать,что здесь необходим знак двойных кавычек для командной строки windows в пути к запускаемой программе,что в autoit можно сформировать,если заключить в одинарные кавычки двойные кавычки.

Вообще язык программирования autoit создавался для автоматизации процессов в операционной системе windows и поэтому имеет функции,которые манипулируют внешними окнами.Минусом языка является то,что он не реализован на других операционных системах, отличных от windows.

#include <MsgBoxConstants.au3>
Run("notepad.exe")
Sleep(1000)
If WinActive("[CLASS:Notepad]") Then
MsgBox($MB_SYSTEMMODAL, "", "Окно активно")
Else
MsgBox($MB_SYSTEMMODAL, "","Окно не активно" )
EndIf

Функция WinActive - определяет активно ли окно,обычно принимает класс окна.Здесь использована функция Sleep для задержки выполнения функции WinActive.Конечно эта autoit-программа работает,но лучшим решением является использование функции WinWait,которая приостанавливает выполнение скрипта до появления определенного окна.

#include <MsgBoxConstants.au3>
Run("notepad.exe")
WinWait("[CLASS:Notepad]", "", 10)
If WinActive("[CLASS:Notepad]") Then
MsgBox($MB_SYSTEMMODAL, "", "Окно активно")
Else
MsgBox($MB_SYSTEMMODAL, "","Окно не активно" )
EndIf

Получение управления внешними окнами в autoit-программах позволяет легко автоматизировать,например,установку какого-либо приложения.

Данная autoit-программа автоматизирует запись информации в текстовой файл.Конечно текстовый файл можно записать и без этих манипуляций с графическим интерфейсом.

#include <MsgBoxConstants.au3>
Run("notepad.exe")
WinWait("[CLASS:Notepad]", "", 10)
If WinActive("[CLASS:Notepad]") Then
Send("привет")
Send("!+{F4}",0)
Sleep(500)
Send("{ENTER}")
Sleep(500)
Send("test.txt")
Sleep(500)
Send("{ENTER}")
EndIf


Автоматизация процесса записи файла может являться коротким autoit-кодом.Просто такова специфика задачи,которую нужно реализовать,поэтому возможно очень короткое её решение.
#include <FileConstants.au3>

Local $hFileOpen = FileOpen("test.txt", $FO_APPEND)
FileWrite($hFileOpen, "привет")
FileClose($hFileOpen)

Обычно процессы автоматизации связаны с внешними программами и поэтому второго варианта решения могут не иметь.


Данная autoit-программа позволяет увидеть позицию мыши на экране монитора при нажатии горячей клавиши escape.

#include <MsgBoxConstants.au3>

HotKeySet("{ESC}", "Get_position")
Func Get_position()
Local $aPos = MouseGetPos()
MsgBox($MB_SYSTEMMODAL, "Mouse x, y:", $aPos[0] & ", " & $aPos[1])
EndFunc

While 1
WEnd

Иногда нужно знать координаты мыши,чтобы выполнить ей программный клик c помощью функции MouseClick.

#include <MsgBoxConstants.au3>
#include <AutoItConstants.au3>

HotKeySet("{ESC}", "Get_position")
Func Get_position()
Local $aPos = MouseGetPos()

MouseClick($MOUSE_CLICK_LEFT,  $aPos[0] , $aPos[1], 2)

EndFunc

While 1
WEnd

Например,направив мышь на папку и нажав клавишу escape,можно будет увидеть,как делается программный клик - папка просто откроется.


HotKeySet("{ESC}", " Exit_Windows()")
Func Exit_Windows()
Shutdown(1)
EndFunc

While 1
WEnd

Выше реализована простая идея  выключения операционной системы по нажатии единственной горячей клавиши escape.Также можно эту autoit-программу добавить в реестр в раздел автозагрузки,чтобы она запускалась вместе с windows.

#include <MsgBoxConstants.au3>
Local $hSearch = FileFindFirstFile("*.*")
$hFile = FileOpen("test.txt", 1)
While 1
$sFileName = FileFindNextFile($hSearch)
If @error Then ExitLoop
FileWriteLine($hFile, $sFileName )
WEnd
FileClose($hFile)
FileClose($hSearch)

Данная выше autoit-программа выполняет поиск файлов в текущей директории и выводит их названия в текстовый файл.
Функция FileFindFirstFile производит первичный поиск,а функция FileFindNextFile ищет все последующие файлы.

В этой autoit-программе есть ошибка,значение возвращаемое функцией FileFindFirstFile не записывается в текстовый файл.И еще она записывает не только имена файлов,но и имена директорий,поэтому её нужно исправить,как говорят программисты - пофиксить.

#include <MsgBoxConstants.au3>
Local $hSearch = FileFindFirstFile("*.*")
$hFile = FileOpen("test.txt", 1)
FileWriteLine($hFile, $hSearch )
While 1
$sFileName = FileFindNextFile($hSearch)
If @error Then ExitLoop
FileWriteLine($hFile, $sFileName )
WEnd
FileClose($hFile)
FileClose($hSearch)


Добавление нового вызова функции FileWriteLine в четвертой строке - исправляет первую вышеприведенную программную ошибку.

Немного переделав программу - получился следующий исходный код.


#include <MsgBoxConstants.au3>
Local $hSearch = FileFindFirstFile("*.*")
$hFile = FileOpen("test.txt", 1)

While 1
$sFileName = FileFindNextFile($hSearch)

if FileGetAttrib($sFileName) <> "D" then FileWriteLine($hFile, $sFileName)
If $sFileName = "" Then ExitLoop

WEnd
FileClose($hFile)
FileClose($hSearch)

Функция FileGetAttrib позволяет узнать является ли найденный компонент файлом.Теперь эта autоit-программа действительно записывает в файл только имена файлов текущей директории.

Можно обычный текстовый файл сделать конфигурационным и использовать его для установки настроек autoit-программы.


#include <GUIConstantsEx.au3>
#include <FileConstants.au3>
Local $hFileOpen = FileOpen("config.txt", $FO_READ)
Local $swidth = FileReadLine($hFileOpen, 1)
Local $sheight = FileReadLine($hFileOpen, 2)

Local $hGUI = GUICreate("Конфигурация из файла",$swidth,$sheight)
GUISetState(@SW_SHOW, $hGUI)
While 1
$msg = GUIGetMsg()
if  $msg = $GUI_EVENT_CLOSE then
ExitLoop
endif
WEnd

В текстовом файле config.txt хранится ширина и высота главного окна autoit-программы.Из первой строки читается ширина,из второй строки высота.Функция GUICreate принимает во второй параметр - ширину,в третий параметр - высоту и в соответствии с этим рисует главное окно.


Данную ниже autoit-программу нужно запускать от имени администратора.Она выполняет установку интерпретатора autoit из файла с именем autoit-v3-setup.exe.Здесь не учитывается,установлен autoit или не установлен на машине пользователя.Наличие autoit надо учитывать при автоматизации установщика.Для этого установщика проблема решается в цикле for.Когда autoit на компьютере установлен  нужно вызывать шесть циклов с отправкой клавиши enter,а когда не установлен пять.
#include <MsgBoxConstants.au3>
#include <GUIConstantsEx.au3>
#include <AutoItConstants.au3>


Run("autoit-v3-setup.exe")
WinActivate("AutoIt v3.3.16.1 Setup")
WinWaitActive("AutoIt v3.3.16.1 Setup")

For $i = 0 to 6
Sleep(100)
Send("{ENTER}")
Next

Sleep(25000)
Send("{ENTER}")

В этой autoit-программе я считаю,что если существует директория с интерпретатором,то он установлен на машине.

#include <MsgBoxConstants.au3>
#include <GUIConstantsEx.au3>
#include <AutoItConstants.au3>


Run("autoit-v3-setup.exe")
WinActivate("AutoIt v3.3.16.1 Setup")
WinWaitActive("AutoIt v3.3.16.1 Setup")

if FileExists ("C:\Program Files (x86)\AutoIt3") =1 then

For $i = 0 to 6
Sleep(100)
Send("{ENTER}")
Next

Else
For $i = 0 to 5
Sleep(100)
Send("{ENTER}")
Next

EndIf

Sleep(25000)
Send("{ENTER}")


Рецензии