Учебник по autoit 53

В интернете существует запрос на учебник по 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}")

Конечно отправка клавиш enter с помощью функции Send является самым простым способом взаимодействия с внешними программами.Но это вовсе не значит,что простой способ плох.Главное,что установщик автоматизирован и вероятно,что эта autoit-программа корректна и устойчиво выполняет свои функции.

Далее autoit-программа,которая ищет файл в текущей директории,имя этого файла задаётся в текстовом поле.


#include <GUIConstantsEx.au3>

Local $hGUI = GUICreate("Поиск файла в текущий директории")

Local $Label_1 = GUICtrlCreateLabel("Имя искомого файла",0,0)
Local $name_file = GUICtrlCreateInput("",0,30,400,25)

Local $idRun = GUICtrlCreateButton("Найти файл", 0, 120, 400, 25)

Local $exit_search = 1
GUISetState(@SW_SHOW, $hGUI)

While 1

$msg = GUIGetMsg()
if $msg = $idRun then
$exit_search = 1
Local $hSearch = FileFindFirstFile("*.*")

While $exit_search = 1
Local $sFileName = FileFindNextFile($hSearch)

if $sFileName <> "" and StringCompare($sFileName, GUICtrlRead($name_file)) = 0 then 
msgbox(0,"","Файл найден! " & GUICtrlRead($name_file))
$exit_search = 0
ExitLoop
EndIf
If @error Then ExitLoop
WEnd

endif
if  $msg = $GUI_EVENT_CLOSE then
ExitLoop
endif

WEnd

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

#include <GUIConstantsEx.au3>

Local $hGUI = GUICreate("Случайное арифметическое действие")

Local $Label_1 = GUICtrlCreateLabel("Первое число",0,0)
Local $num_1 = GUICtrlCreateInput("0",0,30,400,25)
Local $Label_2 = GUICtrlCreateLabel("Второе число",0,60)
Local $num_2 = GUICtrlCreateInput("0",0,90,400,25)
Local $Label_3 = GUICtrlCreateLabel("Результат операции",0,130)
Local $num_3 = GUICtrlCreateInput("",0,160,400,25)
Local $idRun = GUICtrlCreateButton("Случайное действие", 0, 200, 400, 25)
Local $Label_4 = GUICtrlCreateLabel("",0,230,200,60)


GUISetState(@SW_SHOW, $hGUI)

While 1
$msg = GUIGetMsg()
if $msg = $idRun then
Local $action = Random(0,3,1)
if $action = 0 Then
GUICtrlSetData($Label_4,"Выполнилось сложение")
endif

if $action = 1 Then
GUICtrlSetData($Label_4,"Выполнилось вычитание")
endif

if $action = 2 Then
GUICtrlSetData($Label_4,"Выполнилось умножение")
endif

if $action = 3 Then
GUICtrlSetData($Label_4,"Выполнилось деление")
endif
EndIf
if  $msg = $GUI_EVENT_CLOSE then
ExitLoop
endif

WEnd

Зачем может понадобиться кому-то этот калькулятор случайных действий.Да к тому же кому нужен этот ущербный учебник по autoit?


Я всё же решил продолжить этот ущербный учебник,чтобы посмотреть,какие  еще идеи может придумать мой головной мозг.
У меня часто возникали одни и те же идеи и я их программировал на разных языках.

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

Autoit-программы имеют расширение .au3 и могут компилироваться в отдельные исполняемые файлы.При нажатии правой кнопкой мыши на autoit-программе появляется строка меню с текстовой строкой Compile Script.Если нажать на эту строку меню - сгенерируется исполняемый файл.

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

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

Как видите в этом учебнике определилось место для объяснений аспектов на естественном языке,без использования исходных кодов.
Конечно исходные тексты говорят сами за себя,когда запущены на выполнение.Ясное дело,что объяснение программы на естественном языке нужно человеку для понимания её функциональной части ,а не вычислительной машине.Естественный язык слишком сложен для понимания его машиной.Поэтому программисты специально пишут программы,связанные с естественным языком,и порой кажется,что вычислительная машина понимает человеческий язык.
Онлайн-переводчики - это один из хороших примеров научения машины человеческому языку.Хотя конечно здесь для программистов есть над чем еще работать.

Конечно создание программы обработки естественных языков должна выполнятся вместе с профессиональными лингвистами.Помощь лингвистов необходима для того,чтобы программисты могли составить алгоритм,работа которого не вызывает особых нареканий и имеет приемлемый результат.Лингвисты более углубленно изучают языки,поэтому их труд позволяет улучшать алгоритмы перевода одного естественного языка на другой.

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

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>


Local $hGUI = GUICreate("Из русского на транслит")
Local $Label_1 = GUICtrlCreateLabel("Слово для перехода",0,0)
Local $ftext = GUICtrlCreateInput("привет",0,30,400,25)
Local $Label_1 = GUICtrlCreateLabel("Слово на транслите",0,60)
Local $text = GUICtrlCreateInput("",0,90,400,25)

Local $idRun = GUICtrlCreateButton("Из русского на транслит", 0, 200, 400, 25)

GUISetState(@SW_SHOW, $hGUI)

While 1
$msg = GUIGetMsg()
if $msg = $idRun then
Local $alphabet1[34]
Local $alphabet2[34]

$alphabet1[0] = "а"
$alphabet1[1] = "б"
$alphabet1[2] = "в"
$alphabet1[3] = "г"
$alphabet1[4] = "д"
$alphabet1[5] = "е"
$alphabet1[6] = "ё"
$alphabet1[7] = "ж"
$alphabet1[8] = "з"
$alphabet1[9] = "и"
$alphabet1[10] = "й"
$alphabet1[11] = "к"
$alphabet1[12] = "л"
$alphabet1[13] = "м"
$alphabet1[14] = "н"
$alphabet1[15] = "о"
$alphabet1[16] = "п"
$alphabet1[17] = "р"
$alphabet1[18] = "с"
$alphabet1[19] = "т"
$alphabet1[20] = "у"
$alphabet1[21] = "ф"
$alphabet1[22] = "х"
$alphabet1[23] = "ц"
$alphabet1[24] = "ч"
$alphabet1[25] = "ш"
$alphabet1[26] = "щ"
$alphabet1[27] = "ъ"
$alphabet1[28] = "ы"
$alphabet1[29] = "ь"
$alphabet1[30] = "э"
$alphabet1[31] = "ю"
$alphabet1[32] = "я"

$alphabet2[0] = "a"
$alphabet2[1] = "b"
$alphabet2[2] = "v"
$alphabet2[3] = "g"
$alphabet2[4] = "d"
$alphabet2[5] = "e"
$alphabet2[6] = "~"
$alphabet2[7] = "zh"
$alphabet2[8] = "z"
$alphabet2[9] = "i"
$alphabet2[10] = "j"
$alphabet2[11] = "k"
$alphabet2[12] = "l"
$alphabet2[13] = "m"
$alphabet2[14] = "n"
$alphabet2[15] = "o"
$alphabet2[16] = "p"
$alphabet2[17] = "r"
$alphabet2[18] = "s"
$alphabet2[19] = "t"
$alphabet2[20] = "u"
$alphabet2[21] = "f"
$alphabet2[22] = "h"
$alphabet2[23] = "ts"
$alphabet2[24] = "ch"
$alphabet2[25] = "sh"
$alphabet2[26] = "sch"
$alphabet2[27] = "^"
$alphabet2[28] = "y"
$alphabet2[29] = "'"
$alphabet2[30] = "eh"
$alphabet2[31] = "ju"
$alphabet2[32] = "ja"


Local $stext = GUICtrlRead($ftext)
Local $translittext = ""
for $i = 1 to StringLen($stext)
Local $sString = StringMid($stext ,$i,1)

for $j = 0 to 32
if  $sString = $alphabet1[$j]  Then
$translittext &= $alphabet2[$j]
ExitLoop
endif

if $sString = " "  Then
$translittext &= " "
ExitLoop

endif

next
next

GUICtrlSetData($text,$translittext)
EndIf
if  $msg = $GUI_EVENT_CLOSE then
ExitLoop
endif

WEnd

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




#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>


Local $hGUI = GUICreate("Денежный курс")
Local $Label_1 = GUICtrlCreateLabel("Курс доллара в рублях",0,0)
Local $text_1 = GUICtrlCreateInput("60",0,30,400,25)
Local $Label_2 = GUICtrlCreateLabel("Количество долларов",0,60)
Local $text_2 = GUICtrlCreateInput("1",0,90,400,25)

Local $idRun = GUICtrlCreateButton("Подсчет количества рублей", 0, 200, 400, 25)

GUISetState(@SW_SHOW, $hGUI)

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

Local $stext = GUICtrlRead($text_1)
Local $stext2 = GUICtrlRead($text_2)
msgbox(0,"Сообщение","количество рублей равно "&($stext*$stext2))
endif

if  $msg = $GUI_EVENT_CLOSE then
ExitLoop
endif

WEnd

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


Func HttpGet($sURL)
Local $oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
$oHTTP.Open("GET", $sURL, False)
$oHTTP.Send()
msgbox(0,"",$oHTTP.ResponseText)
EndFunc


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

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

Функция ObjCreate - создаёт ссылку на com-объект.COM - это технология компании Майкрософт,на русский язык переводится,как объектная модель компонентов и позволяет управлять com-объектом в объектно-ориентированном стиле.Любой com-объект имеет определённые методы,которые можно программно вызывать.
Autoit-программа вызова get-запроса,что демонстрировалась выше использовала com-технологию и вызывала com-объект с использованием функции ObjCreate.

Ниже представлена простая программа,которая запускает диалоговое окно,в котором нужно выбрал mp3-файл и этот файл,если он существует и является музыкальным будет вопроизводится с помощью com-объекта MediaPlayer встроенного в windows.
Сам плеер этот скрипт не показывает,то есть,иными словами, при желании можно создать полноценный музыкальный плеер,базирующийся на этом com-объекте.
Эта autoit-программа еще раз демонстрирует,как взаимодействовать с функцией ObjCreate.

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>


Local $hGUI = GUICreate("Проигрывание файла",500,300)
Local $hname = GUICtrlCreateLabel("", 0, 0,500,200)
GUICtrlSetFont($hname,25)
Local $idRun = GUICtrlCreateButton("проиграть mp3-файла", 150, 200,200, 45)

GUISetState(@SW_SHOW, $hGUI)

While 1
$msg = GUIGetMsg()
if $msg = $idRun then
Local $file_name =FileOpenDialog("поиск файла", @WindowsDir & "\", "Музыка (*.mp3)")

If Not(FileExists($file_name)) Then
msgbox(0,"сообщение","Такого файла нет!")
else
Local $oMedia = ObjCreate("MediaPlayer.MediaPlayer.1")
$oMedia.Open($file_name)
Local $text = "Проигрывается файл с именем "& $file_name
GUICtrlSetData($hname,$text)
EndIf
EndIf

if  $msg = $GUI_EVENT_CLOSE then
ExitLoop
endif

WEnd

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


#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>


Local $hGUI = GUICreate("Использование таймера",500,300)
Local $state = GUICtrlCreateLabel("Проверка простого таймера", 0, 0,500,200)
GUICtrlSetFont($state,25)


GUISetState(@SW_SHOW, $hGUI)
Local $hTimer = TimerInit()

While 1
$msg = GUIGetMsg()
if  $msg = $GUI_EVENT_CLOSE then
ExitLoop
endif


Local $iDiff = TimerDiff($hTimer)
if ($iDiff > 5000 and $iDiff < 5100 ) then
GUICtrlSetData($state,"Программа автоматически завершится примерно через пять секунд")
Endif
if ($iDiff > 10000) then
Exit
endif

WEnd

Я создал autoit-программу,которая программно завершается примерно через десять секунд после запуска.Непонятно для чего это надо,но вроде это моя совершенно новая техническая идея.Также она информирует пользователя,что скоро завершится.


Рецензии