Учебник по autoit 70
Программирование на бейсике начинается с объявления переменной.Переменная - это область памяти,из которой можно либо считывать информации либо перезаписывать информацию.В большинстве случаев такой информацией являются целые числа,так как компьютер заточен на работу именно с числовыми данными.Хотя 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-программу,которая программно завершается примерно через десять секунд после запуска.Непонятно для чего это надо,но вроде это моя совершенно новая техническая идея.Также она информирует пользователя,что скоро завершится.
На базе этой autoit-программы можно создать функционал по напоминанию чего-либо пользователю через определенный промежуток времени.Конечно текст напоминания и промежуток времени должен задавать пользователь.
Я нашел на просторах интернета идею,которую сейчас и реализую в виде autoit-программы.
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
HotKeySet("{UP}","moveup")
HotKeySet("{DOWN}","movedown")
HotKeySet("{LEFT}","moveleft")
HotKeySet("{RIGHT}","moveright")
Global $x
Global $y
Local $aPos = MouseGetPos()
$x = $aPos[0]
$y = $aPos[1]
Func moveup()
Local $aPos = MouseGetPos()
$y = $aPos[1] - 1
MouseMove($x,$y,10)
EndFunc
Func movedown()
Local $aPos = MouseGetPos()
$y = $aPos[1] + 1
MouseMove($x,$y,10)
EndFunc
Func moveleft()
Local $aPos = MouseGetPos()
$x = $aPos[0] - 1
MouseMove($x,$y,10)
EndFunc
Func moveright()
Local $aPos = MouseGetPos()
$x = $aPos[0] + 1
MouseMove($x,$y,10)
EndFunc
Local $hGUI = GUICreate("Управление курсором",500,300)
Local $state = GUICtrlCreateLabel("Нажимайте стрелки для перемещения курсора мыши", 0, 0,500,200)
GUICtrlSetFont($state,25)
GUISetState(@SW_SHOW, $hGUI)
While 1
$msg = GUIGetMsg()
if $msg = $GUI_EVENT_CLOSE then
ExitLoop
endif
WEnd
Нажимая стрелки на клавиатуре можно двигать курсор мыши влево,вправо,вниз и вверх.
В следующей autoit-программе я использую возможности командной строки Aut2Exe.exe для компиляции скриптов.
Только зачем это нужно,если есть сама программа Aut2Exe.exe?
В этом скрипте показывается,как можно работать с командной строкой.Часто в командной строке нужны команды,которые используют двойные кавычки.Поэтому обрамление двойных кавычек в одинарные позволяет задавать вид команд так,как того требует командная строка windows.Пропуск двойных кавычек там,где они нужны - вызывает ошибку командной строки и такая команда просто не выполнится.
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Local $hGUI = GUICreate("Компиляция autoit-скрипта",500,300)
Local $labelname = GUICtrlCreateLabel("Исходный файл на autoit", 0, 0,500,25)
Local $filename = GUICtrlCreateInput("", 20,25,500,25)
Local $idfind = GUICtrlCreateButton("задать файл", 150,50,200, 35)
Local $idCompile = GUICtrlCreateButton("скомпилировать autoit-файл", 150, 200,200, 35)
GUISetState(@SW_SHOW, $hGUI)
While 1
$msg = GUIGetMsg()
if $msg = $idfind then
Local $file_name = FileOpenDialog("поиск файла", "\", "Скрипты (*.au3)")
GUICtrlSetData($filename,$file_name)
EndIf
if $msg = $idCompile then
Local $LocationAut2Exe = @ProgramFilesDir & '\AutoIt3\Aut2Exe\Aut2Exe.exe'
msgbox(0,"",$LocationAut2Exe)
GUICtrlRead($filename,$file_name)
Local $command = $LocationAut2Exe & " /in " & '"'& $file_name & '"'
msgbox(0,"",$command)
Run($command)
EndIf
if $msg = $GUI_EVENT_CLOSE then
ExitLoop
endif
WEnd
Создание программ всегда сопряжено с умственной деятельностью,простую программу невозможно написать без понимания базовых вещей программирования.
Оператор ветвления if - это одна из фундаментальных конструкций,которую железобетонно нужно знать и освоить,чтобы создавать какие-либо приложения.Этот оператор позволяет программе сделать выбор и в зависимости от него выполнить те или иные инструкции.
Autoit-программа ниже все файлы находящиеся на рабочем столе переносит в папку movefile.Вроде такой технической идеи в моей голове не было никогда.
#include <MsgBoxConstants.au3>
Local $hSearch = FileFindFirstFile("*.*")
While 1
$sFileName = FileFindNextFile($hSearch)
if FileGetAttrib($sFileName) <> "D" then
FileMove(@DesktopDir & "\" & $sFileName ,@DesktopDir & "\" & "movefile" & "\" & $sFileName)
Endif
If $sFileName = "" Then ExitLoop
WEnd
FileClose($hSearch)
К великому моему сожалению эта autoit-программа почему-то работает неправильно и я хочу понять,что я сделал не так.
Некоторые мои скрипты с FileFindNextFile стали работать некорректно и я не понимаю,с чем это связано.ведь недавно они выполнялись корректно.
Я чего-то не понимаю,но этот скрипт перемещает файл с именем "12345.au3" в папку movefile,хоть в коде и определено,что он не должен его перемещать.Хорошо,если это я туплю,а не интерпретатор autoit.
#include <MsgBoxConstants.au3>
Local $hSearch = FileFindFirstFile("*.*")
While 1
$sFileName = FileFindNextFile($hSearch)
if FileGetAttrib($sFileName) <> "D" and ($sFileName <> "12345.au3") then
FileMove(@DesktopDir & "\" & $sFileName ,@DesktopDir & "\" & "movefile" & "\" & $sFileName)
Endif
If $sFileName = "" Then ExitLoop
WEnd
FileClose($hSearch)
Я буду искать причины этого странного поведения данной autoit-программы.Дело в том,что функция FileFindNextFile почему-то ошибочно работает - не возращает весь список файлов.Вот где имеется проблема,которую нужно решить.
Как я узнал,что проблема в функции FileFindNextFile.Я просто перенаправил её вывод в текстовый файл и там не оказалось всего списка файлов,находящихся на рабочем столе.
$hSearch = FileFindFirstFile('*.*')
While 1
$sFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
If @extended = 0 Then
MsgBox(0,"",$sFile)
EndIf
WEnd
FileClose($hSearch)
Данный скрипт должен выводить все файлы текущей директории,но он этого не делает.Что я делаю неправильно?Вот она ущербность этого учебника и проявляется уже в реальности более сильнее,чем это было видно раньше.
Дальнейшая игра с функцией FileFindNextFile привела к тому,что в windows у меня получились неудаляемые файлы с помощью меню,которое открывается по клику на правой кнопке мыши.
После перезагрузки windows неудаляемые файлы исчезли с рабочего стола.
Выходит,что при определенных программистом параметрах функции FileFindNextFile и DirMove могут нарушать работу файловой системы windows и это нарушение видимо пользователю.
Таким образом выполняя некоторые скрипты с функцией FileFindNextFile данного учебника вы можете нарушить работу файловой системы windows.Здесь остаётся непонятным,насколько эти нарушения устойчивы,критичны и опасны для нормальной работы операционной системы.
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Local $hGUI = GUICreate("Компиляция autoit-скрипта",500,300)
Local $labelname = GUICtrlCreateLabel("Исходный файл на autoit", 0, 0,500,25)
Local $filename = GUICtrlCreateInput("", 20,25,500,25)
Local $idfind = GUICtrlCreateButton("задать файл", 150,50,200, 35)
Local $labelname = GUICtrlCreateLabel("Имя программы", 0, 100,500,25)
Local $out_filename = GUICtrlCreateInput("test.exe", 20,150,500,25)
Local $idCompile = GUICtrlCreateButton("скомпилировать autoit-файл", 150, 200,200, 35)
GUISetState(@SW_SHOW, $hGUI)
While 1
$msg = GUIGetMsg()
if $msg = $idfind then
Local $file_name = FileOpenDialog("поиск файла", "\", "Скрипты (*.au3)")
GUICtrlSetData($filename,$file_name)
EndIf
if $msg = $idCompile then
Local $LocationAut2Exe = @ProgramFilesDir & '\AutoIt3\Aut2Exe\Aut2Exe.exe'
msgbox(0,"",$LocationAut2Exe)
GUICtrlRead($filename,$file_name)
Local $fout = GUICtrlRead($out_filename)
Local $path = @ScriptDir & "\" & '"' & $fout & '"'
Local $command = $LocationAut2Exe & " /in " & '"'& $file_name & '"' & " /out " & $path
msgbox(0,"",$command)
Run($command)
EndIf
if $msg = $GUI_EVENT_CLOSE then
ExitLoop
endif
WEnd
Я немного допилил программу Компиляция autoit-скрипта,теперь можно указывать произвольное имя,которое будет иметь выходной выполняемый файл после компиляции.
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Local $hGUI = GUICreate("Компиляция autoit-скрипта",500,300)
Local $labelname = GUICtrlCreateLabel("Исходный файл на autoit", 0, 0,500,25)
Local $filename = GUICtrlCreateInput("", 20,25,500,25)
Local $idfind = GUICtrlCreateButton("задать файл", 150,50,200, 35)
Local $labelname = GUICtrlCreateLabel("Имя программы", 0, 100,500,25)
Local $out_filename = GUICtrlCreateInput("test.exe", 20,150,500,25)
Local $idx86 = GUICtrlCreateCheckbox("архитектура процессора x86", 0, 180,170, 25)
Local $idx64 = GUICtrlCreateCheckbox("архитектура процессора x64", 200, 180,170, 25)
Local $idCompile = GUICtrlCreateButton("скомпилировать autoit-файл", 150, 220,200, 35)
Local $location = '\AutoIt3\Aut2Exe\Aut2Exe.exe'
GUICtrlSetState($idx86, $GUI_CHECKED)
GUISetState(@SW_SHOW, $hGUI)
While 1
$msg = GUIGetMsg()
if $msg = $idfind then
Local $file_name = FileOpenDialog("поиск файла", "\", "Скрипты (*.au3)")
GUICtrlSetData($filename,$file_name)
EndIf
if $msg = $idx86 then
If _IsChecked($idx64) Then
$location = '\AutoIt3\Aut2Exe\Aut2Exe.exe'
GUICtrlSetState($idx64, $GUI_UNCHECKED)
EndIf
EndIf
if $msg = $idx64 then
If _IsChecked($idx64) Then
$location = '\AutoIt3\Aut2Exe\Aut2exe_x64.exe'
GUICtrlSetState($idx86, $GUI_UNCHECKED)
EndIf
EndIf
if $msg = $idCompile then
Local $command = SetPath($location)
msgbox(0,"",$command)
Run($command)
EndIf
if $msg = $GUI_EVENT_CLOSE then
ExitLoop
endif
WEnd
Func _IsChecked($idControlID)
Return BitAND(GUICtrlRead($idControlID), $GUI_CHECKED) = $GUI_CHECKED
EndFunc
Func SetPath($location)
Local $LocationAut2Exe = @ProgramFilesDir & $location
msgbox(0,"",$LocationAut2Exe)
GUICtrlRead($filename,$file_name)
Local $fout = GUICtrlRead($out_filename)
Local $path = @ScriptDir & "\" & $fout
Local $command = $LocationAut2Exe & " /in " & '"'& $file_name & '"' & " /out " & $path
return $command
EndFunc
Теперь программа Компиляция autoit-скрипта доработана и позволяет выбрать тип архитектуры процессора с помощью графического элемента - так называемого флажка или галочки.Если выбрать 32-разрядный версию компиляции,то автоматически отключается компиляцию в 64-разрядную версию.Обратное тоже верно.
Вполне возможно,что компьютерные технологии так разовьются,что программы вообще не будут поддерживать 32-разрядный режим процессора.
Я нашел небольшую ошибку в этой программе - в функции SetPath совершенно не нужно передавать параметр $location,так как переменная $location объявляется в главном потоке программы и поэтому её значение видимо из функций по имени без её непосредственной передачи.
В этом учебнике не хватает самого простого текстового редактора, написанного на autoit.Поэтому я помещаю его здесь.
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <FileConstants.au3>
GUICreate("Простой текстовый редактор",500,500)
Local $idMyedit = GUICtrlCreateEdit("" , 0, 0, 500, 400, $ES_AUTOVSCROLL + $WS_VSCROLL)
Local $idButton_open = GUICtrlCreateButton("Открыть файл", 0, 400,200,50)
Local $idButton_save = GUICtrlCreateButton("Сохранить файл файл", 250, 400,200,50)
GUISetState(@SW_SHOW)
While 1
$msg = GUIGetMsg()
if $msg = $GUI_EVENT_CLOSE then
ExitLoop
endif
if $msg = $idButton_open then
Local $sFileOpenDialog = FileOpenDialog("Открыть файл", @Scriptdir & "\", "Текстовые файлы (*.txt*)",$FD_FILEMUSTEXIST)
Local $hFileOpen = FileOpen($sFileOpenDialog, $FO_READ)
Local $usertext = FileRead($hFileOpen)
GUICtrlSetData($idMyedit,$usertext)
endif
if $msg = $idButton_save then
Local $sFileSaveDialog = FileSaveDialog("Сохранить файл",@Scriptdir, "Текстовые файлы (*.txt)")
Local $hFileOpen = FileOpen($sFileSaveDialog, $FO_APPEND)
Local $usertext = GUICtrlRead($idMyedit)
FileWrite($hFileOpen,$usertext)
endif
WEnd
Данный текстовый редактор умеет открывать файлы и сохранять в файл то,что ввел пользователь.Функция FileOpenDialog используется для того,чтобы вызвать стандартное диалоговое окно windows для выбора файла.Функция FileSaveDialog позволяет сформировать путь к файлу,который потом может использоваться в autoit-программе.В нашем случае эта функция помогает сформировать путь в операционной системе windows,по которому будет записан произвольный текст пользователя.
Есть одна ошибка в этой программе,в функции FileOpen используется флаг $FO_APPEND,который отвечает за дозапись текстового файла.Поэтому,когда происходит вторичное сохранение файла текст пользователя и содержимое текстового файла неидентичны.Чтобы пофиксить эту небольшую проблему необходимо указать флаг $FO_OVERWRITE.Хотя иногда в программах действительно нужна дозапись.
Скрипты автоматизации должны работать так,как того ожидает пользователь.Но иногда возникает непредвиденные ситуации и скрипт автоматизации сбоит.Защититься от такого рода проблем невозможно,если конечно не создать совершенную операционную систему.Пока таких идеальных операционных систем не создано программистами,да и вообще возможно ли это сделать?
Я хотел с помощью цикла привязать буквы русского языка к функции HotKeySet,но из этого ничего не получилось.
Local $alphabet1[34]
for $index = 0 to 32
$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] = "я"
HotKeySet('"' & $alphabet1[$index] & '"',"myalphabet")
HotKeySet('"' & StringUpper($alphabet1[$index]) & '"',"myalphabet")
Next
func myalphabet()
msgbox(0,"","нажата буква русского алфавита")
endfunc
while 1
WEnd
Тогда я написал следующий генератор,имеющий отношение к функции HotKeySet.
#include <FileConstants.au3>
Local $alphabet1[34]
for $index = 0 to 32
$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] = "я"
Local $hFileOpen = FileOpen("алфавит.txt", $FO_APPEND)
FileWriteLine($hFileOpen,"HotKeySet(" & '"' & $alphabet1[$index] & '"'&","& '"' & "myalphabet" & '")')
FileWriteLine($hFileOpen,"HotKeySet(" & '"' & StringUpper($alphabet1[$index]) & '"'&","& '"' & "myalphabet" & '")')
Next
Казалось бы,что следующий код должен показывать сообщение,только если нажата русская маленькая или большая буквы,но этого поведения не происходит.Выходит,что так устроен autoit.
HotKeySet("а","myalphabet")
HotKeySet("А","myalphabet")
HotKeySet("б","myalphabet")
HotKeySet("Б","myalphabet")
HotKeySet("в","myalphabet")
HotKeySet("В","myalphabet")
HotKeySet("г","myalphabet")
HotKeySet("Г","myalphabet")
HotKeySet("д","myalphabet")
HotKeySet("Д","myalphabet")
HotKeySet("е","myalphabet")
HotKeySet("Е","myalphabet")
HotKeySet("ё","myalphabet")
HotKeySet("Ё","myalphabet")
HotKeySet("ж","myalphabet")
HotKeySet("Ж","myalphabet")
HotKeySet("з","myalphabet")
HotKeySet("З","myalphabet")
HotKeySet("и","myalphabet")
HotKeySet("И","myalphabet")
HotKeySet("й","myalphabet")
HotKeySet("Й","myalphabet")
HotKeySet("к","myalphabet")
HotKeySet("К","myalphabet")
HotKeySet("л","myalphabet")
HotKeySet("Л","myalphabet")
HotKeySet("м","myalphabet")
HotKeySet("М","myalphabet")
HotKeySet("н","myalphabet")
HotKeySet("Н","myalphabet")
HotKeySet("о","myalphabet")
HotKeySet("О","myalphabet")
HotKeySet("п","myalphabet")
HotKeySet("П","myalphabet")
HotKeySet("р","myalphabet")
HotKeySet("Р","myalphabet")
HotKeySet("с","myalphabet")
HotKeySet("С","myalphabet")
HotKeySet("т","myalphabet")
HotKeySet("Т","myalphabet")
HotKeySet("у","myalphabet")
HotKeySet("У","myalphabet")
HotKeySet("ф","myalphabet")
HotKeySet("Ф","myalphabet")
HotKeySet("х","myalphabet")
HotKeySet("Х","myalphabet")
HotKeySet("ц","myalphabet")
HotKeySet("Ц","myalphabet")
HotKeySet("ч","myalphabet")
HotKeySet("Ч","myalphabet")
HotKeySet("ш","myalphabet")
HotKeySet("Ш","myalphabet")
HotKeySet("щ","myalphabet")
HotKeySet("Щ","myalphabet")
HotKeySet("ъ","myalphabet")
HotKeySet("Ъ","myalphabet")
HotKeySet("ы","myalphabet")
HotKeySet("Ы","myalphabet")
HotKeySet("ь","myalphabet")
HotKeySet("Ь","myalphabet")
HotKeySet("э","myalphabet")
HotKeySet("Э","myalphabet")
HotKeySet("ю","myalphabet")
HotKeySet("Ю","myalphabet")
HotKeySet("я","myalphabet")
HotKeySet("Я","myalphabet")
func myalphabet()
msgbox(0,"","нажата буква русского алфавита")
endfunc
while 1
WEnd
Чтобы определить код раскладки клавиатуры можно использовать следующий скрипт.
#include <GUIConstants.au3>
#include <WinAPIEx.au3>
$hWnd = WinGetHandle("[ACTIVE]")
HotKeySet("{ESC}","mykey")
func mykey()
Local $hFileOpen = FileOpen("код раскладки.txt", $FO_APPEND)
FileWriteLine($hFileOpen,_WinAPI_GetKeyboardLayout($hWnd))
endfunc
while 1
WEnd
Данная autoit-программа выводит сообщение о том,что включена русская раскладка.Она сравнивает код раскладки введенный программистом и код,полученный из функции _WinAPI_GetKeyboardLayout.
#include <GUIConstants.au3>
#include <WinAPIEx.au3>
$hWnd = WinGetHandle("[ACTIVE]")
$ruscode = 0x04190419
if _WinAPI_GetKeyboardLayout($hWnd) = $ruscode Then
msgbox(0,"Сообщение","Включена русская раскладка")
endif
Свидетельство о публикации №123031800233