Autohotkey как пользоваться
Autohotkey как пользоваться
Как правильно пользоваться программой AutoHotKey?
AutoHotKey представляет собой один из наиболее полезных и простых скриптеров для пользователей, при помощи которого можно реализовать достаточно большое количество функций. Однако многие пользователи не знают о том, как писать скрипты с помощью этой программы, чтобы она действительно была полезной.
Работа с клавиатурой
Для того, чтобы отправить сигнал о нажатии определенной клавиши в активное на данный момент окно, нужно использовать команду «Send». К примеру, можно назначить комбинацию клавиш «Win+пробел» для того, чтобы автоматически вводилась фраза «Добрый вечер!». Для этого нужно будет использовать следующие команды:
Чтобы просто симулировать использование какой-то конкретной клавиши, вам нужно фигурные скобки. Таким образом, для нажатия кнопки «Enter» вам нужно будет воспользоваться командой «<Enter>».
Специальные клавиши
При необходимости вы можете сделать так, чтобы программа автоматически нажимала специальные клавиши, такие как «Ctrl», «Shift» и «Alt». К примеру, используя команду «Send ^с! », вы делаете так, чтобы программа использовала автоматическую вставку, а потом сразу же переключалась на другое окно.
Символ «^» в данном случае указывает программе использовать сначала клавишу «Ctrl», в то время как «!» представляет собой клавишу «Alt». Соответственно, команда «<tab>», как и говорилось выше, дает программе установку использовать кнопку «Tab». Чтобы не вызвать никаких проблем и конфликтов в процессе работы программы, вам следует использовать кириллицу, так как клавиши будут чаще всего совпадать с нынешней раскладкой клавиатуры.
Более подробно ознакомиться со списком специальных символов вы сможете непосредственно через меню «Справка» в самой программе.
Чтобы обеспечить более быструю печать в окне любой программы, вы можете воспользоваться так называемыми горячими строчками. По сути, это различные макросы, которые позволяют вам писать одинаковые сообщения, но вместо того, чтобы тратить на них большое количество времени, вполне достаточно будет нажать определенную комбинацию клавиш.
К примеру, можно сделать так, чтобы сокращение «бгф» использовалось для ввода в чат длинной фразы, такой как, например, «берегись, кинул гранату, это флешка». Делается это с помощью следующей команды:
::бгф::берегись, кинул гранату, это флешка
При этом сразу стоит отметить, что для работоспособности скрипта нужно будет после введенного сокращения нажать на «пробел» или просто поставить запятую.
Имитируем клики мышкой
С кликами мышкой работать несколько сложнее, чем с использованием клавиатуры, так как здесь помимо кнопок есть еще и определенное месторасположение курсора, которое нужно указывать. В связи с этим пользователь сначала должен определить координаты X и Y того места на экране, куда должно отправляться созданное событие. Делается это при помощи встроенной в программу утилиты под названием Active Window Info.
1. Для начала вам следует запустить саму программу из трея на заранее открытом скрипте. Также вы можете просто кликнуть меню «Пуск», выбрать «Все программы» и там в меню «AutoHotKey» выбрать «Active Window Info». Сразу стоит сказать о том, что данное окно будет автоматически располагаться поверх остальных, что требуется для удобства работы с утилитой.
2. Запустите подопытное окно программы. Для этого нужно кликнуть по заголовку или же использовать стандартную комбинацию клавиш «Alt+Tab».
3. Перемещайте курсор в то место, где нужно будет осуществлять нужное вам событие, после чего посмотрите уже в окно Active Window Info. Теперь записывайте координаты, которые показаны в окне этой программы (их можно найти в строчке «On Screen» или же в строке «In Active Window») в зависимости от того, какая область конкретно на данный момент вас интересует.
Стоит отметить тот факт, что у пользователей Windows XP есть возможность использования комбинации клавиш «Shift+Alt+Tab», при помощи которой окно Window Spy замораживается, а пользователь переходит к нему для копирования нужных цифр.
4. Ставьте полученные вами координаты в скрипте после команды «MouseClick», при этом вставлять нужно только через запятую и после того, как будет обозначена кнопка мыши.
Выглядеть все это может примерно так:
В данном случае «MouseClick» – это команда, которая предназначается для щелчков мыши при помощи AutoHotKey, но для ее нормальной работы нужно будет задать также три параметра через запятую. Первый указывает кнопку мыши (можно писать Left или Right целиком, а можно просто использовать буквы L и R. M указывает на необходимость клика по скроллу). Остальные параметры представляют собой координаты X и Y того места на экране, в которое нужно будет кликнуть.
Также есть команда «MouseMove», при помощи которой курсор просто перемещается в определенную область на экране. Пользоваться ей гораздо проще, ведь нужно просто ввести команду и указать координаты, например:
Помимо всего прочего, программа может использоваться для перетаскивания мышью каких-либо объектов, что осуществляется при использовании команды «MouseClickDrag». В этой команде уже нужно будет вводить сразу пять параметров, первый из которых представляет собой клик нужной кнопкой мыши, второй и третий включают в себя стартовые координаты, а четвертый и пятый – последние, то есть то место, где мышка должна быть отпущена.
Команда может выглядеть примерно следующим образом:
MouseClickDrag, L, 33, 22, 66, 44
Таким образом, вы можете экспериментировать с самыми разнообразными командами, и доводить автоматизм различных процедур до самых невероятных вершин.
Содержание
Введение и простые примеры
Функция похожа на подпрограмму (Gosub), отличаясь от нее только способностью принимать параметры (входные данные) от вызывающего оператора. Кроме того, функция при желании может возвращать значения вызывающему оператору. Рассмотрим приведенный ниже пример простой функции, принимающей два числа и возвращающей их сумму:
Приведенный выше пример называется определением функции, так как создает функцию под названием «Add» (нечувствительно к регистру) и определяет, что для вызова этой функции необходимо задать ровно два параметра (x и y). Чтобы вызвать функцию, присвойте ее результат переменной с оператором :=, как показано в примере:
Функцию можно также вызвать, не сохраняя возвращаемое значение:
Однако в этом случае любое значение, возвращаемое функцией, отбрасывается. Поэтому, если исполнение функции не приводит к какому-нибудь другому результату помимо возврата значения, в вызове этой функции нет никакого смысла.
Поскольку вызов функции является выражением, не следует заключать в знаки процента имена переменных в списке ее параметров. И напротив, буквальные строки необходимо заключать в двойные кавычки. Например:
И, наконец, функции можно вызывать в параметрах любой команды (кроме параметров OutputVar и InputVar, таких, как в команде StringLen). Однако в параметрах, не поддерживающих выражения, обязательно нужно использовать префикс «%»:
Параметры
При определении функции ее параметры перечисляются в круглых скобках рядом с именем функции (между именем функции и открывающей скобкой не должно быть пробелов). Если функция не должна принимать никаких параметров, оставьте скобки пустыми. Например: GetCurrentTimestamp().
Для функции параметры по существу являются тем же самым, что и локальные переменные, кроме случаев, когда они определены как ByRef:
В примере, приведенном выше, в результате использования ByRef каждый параметр становится псевдонимом для переменной, переданной от вызывающего оператора. Другими словами, как сам параметр, так и переменная вызывающего оператора ссылаются на одно и то же содержимое памяти, что позволяет функции Swap изменять переменные вызывающего оператора, перемещая содержимое параметра Left в параметр Right и наоборот.
И напротив, если бы ByRef в этом примере не использовался, параметры Left и Right были бы копиями переменных вызывающего оператора, и функция Swap не имела бы должного эффекта.
Поскольку команда return может возвращать только одно значение, ByRef можно использовать для того, чтобы посылать дополнительные результаты обратно оператору, вызывающему функцию. Это достигается при передаче вызывающим оператором переменной (обычно пустой), в которой функция сохранит значение.
Явное ограничение: параметру функции с ключевым словом ByRef невозможно передать переменную окружения.
Опциональные параметры [v1.0.35+]
При определении функции один или несколько параметров можно пометить как опциональные. Для этого к параметру добавляется знак равенства и значение по умолчанию. В примере, приведенном ниже, параметр Z помечен как опциональный:
Когда в примере вызывающий оператор передает функции три параметра, значение по умолчанию игнорируется. Однако, если передано только два параметра, параметру Z автоматически присваивается значение 0.
Нельзя поставить опциональные параметры в середину списка параметров. Другими словами, все параметры, расположенные справа от первого опционального параметра, также должны быть опциональными.
Значение параметра по умолчанию должно быть одним из следующих: true, false, буквальное целое число, буквальное число с плавающей запятой или буквальная пустая строка («»).
Локальные переменные
Все переменные, которые упомянуты или созданы внутри функции, являются локальными по умолчанию (кроме встроенных переменных, таких, как Clipboard, ErrorLevel или A_TimeIdle). Содержимое каждой локальной переменной могут видеть только команды, используемые внутри функции. Следовательно, локальная и глобальная переменные могут иметь одно имя, но разное содержание. И наконец, каждый раз при вызове функции локальная переменная первоначально не имеет значения.
Глобальные переменные: чтобы сослаться на существующую глобальную переменную внутри функции (или создать новую глобальную переменную), перед использованием объявите эту переменную глобальной. Например:
Если функции необходимо создать или сослаться на большое количество глобальных переменных, можно объявить все переменные функции глобальными (кроме ее параметров). Для этого необходимо поместить в первой строке слово «global» или объявить в ней локальную переменную. Например:
Глобальный режим также можно использовать в функции для создания глобального массива, как например, цикл, присваивающий значения Array%A_Index%.
Статические переменные: чтобы сохранить значение переменной между вызовами, ее можно объявить статической. Например:
Дополнительная информация о локальных и глобальных переменных:
Несколько переменных можно объявить в одной и той же строке, разделив их запятыми, как показано в примере:
Поскольку слова local, global и static обрабатываются немедленно после запуска скрипта, их нельзя выполнить с помощью условного оператора. Другими словами, использование слов local, global или static внутри блока IF или ELSE вступает в силу безоговорочно. Кроме того, на сегодняшний день невозможно объявить динамическую переменную, как, например global Array%i%.
Внутри функции ссылка на динамическую переменную (напр.: Array%i%) всегда разрешается в локальную переменную, если переменная с таким именем существует. В противном случае используется глобальная переменная. Если не существует ни локальной, ни глобальной переменной, будет создана локальная переменная (если не действует глобальный режим).
Таким образом, функция может создать глобальный массив вручную (например, так: Array%i% := A_Index) только в глобальном режиме.
Для команд, создающих массивы (таких, как StringSplit), полученный в результате массив будет локальным, если не действует глобальный режим или если первый элемент массива объявлен как локальная переменная (сказанное также верно, если передан один из параметров функции, даже если этот параметр ByRef). И наоборот, если первый элемент был объявлен глобальным, будет создан глобальный массив. Первым элементом для команды StringSplit является ArrayName0. Для других создающих массивы команд, таких, как WinGet List, первым элементом является ArrayName (т.е. без числа).
Использование директивы #Include для распределение функций между множественными скриптами
Для загрузки функций из внешнего файла можно использовать директиву #Include (даже в начале скрипта).
Пояснения: когда скрипт в процессе исполнения встречает определение функции, он немедленно пропускает его и возобновляет исполнение со строки после закрывающей скобки. Следовательно, выполнение никогда не может начаться с подобной функции, а присутствие одной или нескольких функций на самом верху скрипта не влияет на секцию авто-выполнения.
Схема быстрой булевой оценки
Если операторы AND и OR используются внутри выражения, применяется схема быстрой оценки (вне зависимости от того, есть ли вызовы функции). При этой схеме не оцениваются части выражения, не влияющие на конечный результат. Рассмотрим пример, иллюстрирующий эту мысль:
В приведенном примере функция FindColor() никогда не будет вызвана, если переменная ColorName не имеет значений, так как левая часть выражения с оператором AND будет ложной, и, следовательно, его правая часть не сможет изменить конечный результат на истинно.
Очень важно понять, что подобное поведение приводит к тому, что если функция вызвана в правой части выражений с операторами AND или OR, любой побочный эффект, порожденный функцией, такой, как изменение содержимого глобальной переменной, возможно никогда не будет иметь место.
Также следует заметить, что быстрая оценка будет производиться иерархически по вложенным операторам AND и OR. Например, в следующем выражении, если ColorName не имеет значения, будет производиться только крайнее левое сравнение, так как в этом случае левой стороны достаточно, чтобы с уверенностью определить итоговый результат:
Как показано в примере, приведенном выше, для увеличения производительности затратную (занимающую много времени) функцию, как правило, следует помещать в правую часть выражений с операторами AND или OR. Эту технику можно также использовать, чтобы помешать вызову функции, если один из параметров содержит неподходящее значение (напр., пустую строку).
Использование подпрограмм в функции
Хотя функция не может содержать определений других функций, она может содержать приватные подпрограммы. Как и в случае с другими подпрограммами, используйте команду Gosub для запуска функций и команду Return для возврата (при этом команда Return будет принадлежать команде Gosub, а не функции).
Если функция использует команду Gosub, чтобы перейти к общедоступной подпрограмме (той, что находится за пределами фигурных скобок функции), все переменные будут глобальными, а собственная локальная переменная функции будет недоступна, пока исполняется подпрограмма.
Хотя использование команды Goto как правило не одобряется, ее можно применить внутри функции, чтобы перейти на другую позицию внутри той же самой функции, что может помочь упростить большие функции, имеющие много точек возврата, каждая из которых перед возвратом должна сделать некоторую зачистку.
Хотя команда Goto, направленная вне функции, игнорируется, функция может перейти (Gosub) к внешней/общедоступной подпрограмме, после чего выполнить команду Goto оттуда.
Функция может содержать подпрограммы для таймеров (timers), меток перехода GUI, пунктов меню и других похожих функций. Это нужно, чтобы заключить подпрограммы в отдельный файл для использования с директивой #Include, что предохраняет их от использования вместе с секцией авто-выполнения скрипта. Однако если функция таких подпрограмм будет вызываться и обычным способом, а не просто служить в качестве контейнера для подпрограмм, то эти подпрограммы должны использовать только статические и глобальные переменные (не локальные). Причиной этого служит то, что поток подпрограммы, прерывающий поток вызова функции (или наоборот) сможет изменять значения локальных переменных, обнаруженных прерванным потоком. Кроме того, каждый раз, когда функция возвращается к своему вызывающему оператору, все локальные переменные функции очищаются от значений, чтобы освободить их память.
Общие замечания
Если поток выполнения, действующий внутри функции, достигает закрывающей скобки функции до того, как дойдет до команды Return, функция заканчивается и возвращает вызывающему оператору пустое значение (пустую строку). Пустое значение возвращается и в тех случаях, когда функция явно опускает параметры команды Return.
Если функция использует команду Exit для завершения текущего потока, оператор, вызывающий функцию, не получает никакого значения. Например, если Add() использует команду Exit, оператор Var := Add(2, 3) оставит переменную Var без изменений. То же самое происходит, если функция приводит к ошибке времени исполнения, такой, как например, запуск несуществующего файла (если параметр UseErrorLevel не действует).
Функция может изменить значение переменной ErrorLevel, чтобы возвратить дополнительное значение, более легкое для запоминания.
Чтобы вызвать функцию с одним или несколькими пустыми значениями (пустыми строками), используйте пустую пару кавычек, как показано в примере: FindColor(ColorName, «»)
Поскольку вызов функции не начинает новый поток, любые изменения, сделанные функцией в настройках, таких, как SetKeyDelay и SetTitleMatchMode, вступят в силу и для оператора, вызывающего эту функцию.
Оператор, вызывающий функцию, может передать ей несуществующую переменную или элемент массива, что удобно, если функция ждет, что соответствующим параметром будет параметр ByRef. Например, вызов GetNextLine(BlankArray%i%) автоматически создаст переменную BlankArray%i% (какой она будет, локальной или глобальной, зависит от местоположения вызывающего оператора и от того, будет ли действовать глобальный режим.)
Команда ListVars может отражать локальные переменные вместе с их содержимым, что полезно при отладке скриптов.
Известные ограничения: функция может рекурсивно вызвать сама себя, однако если она передаст одну из своих локальных переменных или параметров самой себе, используя ByRef, параметр ByRef нового уровня будет ссылаться на свою переменную, а не на переменную предыдущего уровня. Подобная проблема не возникнет, если функция передаст себе глобальную переменную или параметр ByRef, ссылающийся на глобальную или локальную переменную другой функции.
Встроенные функции
Встроенная функция будет замещена, если в скрипте задана собственная функция с тем же именем. Например, в скрипте может быть собственная функция WinExist(), которая будет вызвана вместо стандартной функции.
Внешние функции, постоянно хранящиеся в DLL-файлах, можно вызвать с помощью команды DllCall().
Все встроенные функции требуют версии 1.0.34 и выше, кроме функций WinActive и WinExist, которые требуют версии 1.0.31 и выше.
Часто используемые функции
GetKeyState(KeyName [, «P» or «T»]): в отличие от команды GetKeyState, которая возвращает D, когда клавиша нажата и U, когда она отпущена, данная функция возвращает истину (1), если клавиша нажата и ложь (0), если опущена. Если параметр KeyName недействителен, возвращается пустая строка. См. о других возвращаемых значениях и об инструкциях по применению в описании команды GetKeyState.
StrLen(String): возвращает длину String (строки). Если String является переменной, которой ранее было задано значение ClipboardAll, возвращается полный размер строки. Похожая команда: StringLen.
WinActive(«WinTitle» [, «WinText», «ExcludeTitle», «ExcludeText»]): возвращает уникальный идентификатор активного окна, если оно соответствует заданным условиям. Если соответствия нет, функция возвращает 0. Так как все числа, не равные нулю, рассматриваются как «истина», оператор if WinActive(«WinTitle») верен, если окно WinTitle активно. См. описание команды IfWinActive.
WinExist(«WinTitle» [, «WinText», «ExcludeTitle», «ExcludeText»]): возвращает уникальный идентификатор первого совпадающего окна (0, если совпадения нет). Так как все числа, не равные нулю, рассматриваются как «истина», оператор if WinExist(«WinTitle») верен, если окно WinTitle существует. См. описание команды IfWinExist.
Asc(String): возвращает для первого символа в параметре String код ASCII (число в диапазоне от 1 до 255). Если String не имеет значения, возвращается 0.
IsLabel(LabelName) [в версиях от 1.0.38 и выше]: возвращает число, не равное нулю, если параметр LabelName существует в скрипте в виде подпрограммы, горячей клавиши или строки автозамены (не включайте в параметр LabelName конечную запятую). Например, оператор if IsLabel(VarContainingLabelName) верен, если метка существует, и ложен иначе. Функция полезна для того, чтобы избежать ошибок времени исполнения при определении динамической метки в таких командах, как Gosub, Hotkey, Menu и Gui.
OnMessage(MsgNumber [, «FunctionName»]): см. описание команды OnMessage.
VarSetCapacity(UnquotedVarName [, RequestedCapacity]): увеличивает ёмкость переменной или освобождает её память. См. описание команды VarSetCapacity.
Примечание: обычно, если одним из входящих параметров является нечисловое значение, математические функции возвращают пустое значение (пустую строку).
Abs(Number): возвращает абсолютное значение параметра Number. Возвращаемое значение принадлежит тому же типу, что и Number (целое число или число с плавающей запятой).
Exp(N): возвращает e (приблизительно 2.71828182845905), возведенную в степень N. Параметр N может быть отрицательным и содержать десятичную точку. Чтобы возвести в степень другие числа (не равные e), используйте оператор **.
Sin(Number) | Cos(Number) | Tan(Number): возвращает тригонометрические синус/косинус/тангенс параметра Number. Number должен быть выражен в радианах.
ATan(Number): возвращает арктангенс (число, тангенс которого равен параметру Number) в радианах.
Scripting Language
An AutoHotkey script is basically a set of instructions for the program to follow, written in a custom language exclusive to AutoHotkey. This language bears some similarities to several other scripting languages, but also has its own unique strengths and pitfalls. This document describes the language and also tries to point out common pitfalls.
See Concepts and Conventions for more general explanation of various concepts utilised by AutoHotkey.
There are two distinct styles of syntax used in AutoHotkey: legacy syntax and expressions.
Table of Contents
General Conventions
Names: Variable and function names are not case sensitive (for example, CurrentDate is the same as currentdate ). For details such as maximum length and usable characters, see Names.
No typed variables: Variables have no explicitly defined type; instead, a value of any type can be stored in any variable (excluding built-in variables). Numbers may be automatically converted to strings (text) and vice versa, depending on the situation.
Declarations are optional: Except where noted on the functions page, variables do not need to be declared; they come into existence simply by using them (and each variable starts off empty/blank).
Spaces are mostly ignored: Indentation (leading space) is important for writing readable code, but is not required by the program and is generally ignored. Spaces and tabs are generally ignored at the end of a line, within an expression (except between quotes), and before and after command parameters. However, spaces are significant in some cases, including:
Line breaks are meaningful: Line breaks generally act as a statement separator, terminating the previous command or expression. (A statement is simply the smallest standalone element of the language that expresses some action to be carried out.) The exception to this is line continuation (see below).
Line continuation: Long lines can be divided up into a collection of smaller ones to improve readability and maintainability. This is achieved by preprocessing, so is not part of the language as such. There are two methods:
Comments
Comments are portions of text within the script which are ignored by the program. They are typically used to add explanation or disable parts of the code.
Scripts can be commented by using a semicolon at the beginning of a line. For example:
Comments may also be added at the end of a line, in which case the semicolon must have at least one space or tab to its left. For example:
In addition, the /* and */ symbols can be used to comment out an entire section, but only if the symbols appear at the beginning of a line (excluding whitespace), as in this example:
Since comments are ignored when a script is launched, they do not impact performance or memory utilization.
The default comment character (semicolon) can be changed to some other character or string via #CommentFlag.
Expressions
Values are numbers, objects or strings. A literal value is one written physically in the script; one that you can see when you look at the code.
Strings / Text
For a more general explanation of strings, see Strings.
Quoted strings can contain escape sequences such as `t (tab), `n (linefeed), and `r (carriage return). Unlike unquoted text, it is not necessary to escape commas or percent signs, as quoted strings cannot contain variables. The use of the `» escape sequence to produce a literal quote-character is currently not supported; instead, use two consecutive quotes as shown above.
Variables
For a basic explanation and general details about variables, see Variables.
Implicit concatenation is also known as auto-concat. In both cases, the spaces preceding the variable and dot are mandatory.
The Format function can also be used for this purpose. For example:
Percent signs within an expression are used to create dynamic variable references and dynamic function calls. Most of the time these constructs are not needed, so in general, variable names should not be enclosed in percent signs within an expression.
Operators
Function Calls
For a general explanation of functions and related terminology, see Functions/Commands.
Functions take a varying number of inputs, perform some action or calculation, and then return a result. The inputs of a function are called parameters or arguments. A function is called simply by writing its name followed by its parameters enclosed in parentheses. For example, GetKeyState(«Shift») returns (evaluates to) 1 if Shift is being held down or 0 otherwise.
Note: There must not be any space between the function name and open parenthesis.
When compared to commands, the requirement for parentheses may seem cryptic or verbose at first, but they are what allows a function call to be combined with other operations. For example, the expression GetKeyState(«Shift», «P») and GetKeyState(«Ctrl», «P») returns 1 only if both keys are being physically held down.
Function names are always global, and are separate to variable names. For example, Round can be both a variable name and a function name, and Round := 1 will not affect Round(n) in any way.
Operators for Objects
There are other symbols used in expressions which don’t quite fit into any of the categories defined above, or that affect the meaning of other parts of the expression, as described below. These all relate to objects in some way. Providing a full explanation of what each construct does would require introducing more concepts which are outside the scope of this section.
Alpha.Beta is often called member access. Alpha is an ordinary variable, and could be replaced with a function call or some other sub-expression which returns an object. When evaluated, the object is sent a request «give me the value of property Beta«, «store this value in property Beta» or «call the method named Beta«. In other words, Beta is a name which has meaning to the object; it is not a local or global variable.
Alpha.Beta() is a method call, as described above.
Alpha.Beta[Param] is a specialised form of member access which includes additional parameters in the request. While Beta is a simple name, Param is an ordinary variable or sub-expression, or a list of sub-expressions separated by commas (the same as in a function’s parameter list).
new ClassName() is used to instantiate a class, or create an object derived from another object. Although this looks like a function call, ClassName is actually an ordinary variable. Similarly, new Alpha.Beta() would create an object derived from the object returned by Alpha.Beta ; Beta is neither a function nor a method. If the optional parentheses are present, they may contain parameters for the object’s __New method.
[A, B, C] creates an array with the initial contents A, B and C (all variables in this case), where A is element 1.
MyFunc(Params*) is a variadic function call. The asterisk must immediately precede the closing parenthesis at the end of the function’s parameter list. Params must be a variable or sub-expression which returns an array object. Although it isn’t valid to use Params* just anywhere, it can be used in an array literal ( [A, B, C, ArrayToAppend*] ) or indexer ( Alpha[Params*] ).
Expression Statements
Not all expressions can be used alone on a line. For example, a line consisting of just 21*2 or «Some text» wouldn’t make any sense. An expression statement is an expression used on its own, typically for its side-effects. Most expressions with side-effects can be used this way, so it is generally not necessary to memorise the details of this section.
The following types of expressions can be used as statements:
Expressions that start with any of those described above (but not those described below) are also allowed, for simplicity. For example, MyFunc()+1 is currently allowed, although the +1 has no effect and its result is discarded. Such expressions might become invalid in the future due to enhanced error-checking.
Legacy Syntax
Unquoted text is simply text, not enclosed in quote marks, just straight up. Since the text has no explicit start and end marks, it ends at the end of the line or the end of the parameter. Leading and trailing spaces and tabs are ignored. Within unquoted text, the following characters have special meaning:
% : Enclose a variable name in percent signs to include the contents of that variable. For example, The year is %A_Year%.
Note: Variable names are not always enclosed in percent signs; they are required only within unquoted text. Percent signs should not be used anywhere else, except to create a dynamic variable reference or dynamic function call.
Note: Only a plain variable name can be used. Array elements, properties and other expressions are not supported.
, : Comma is used to delimit (separate) the parameters of a command, with some exceptions. It has no special meaning when used in an assignment or comparison, so is interpreted literally in such cases.
` : An escape character is usually used to indicate that the character immediately following it should be interpreted differently than it normally would. For example, `% produces a literal percent sign and `, produces a literal comma. Some other common escape sequences produce special characters, such as `t (tab), `n (linefeed), and `r (carriage return).
If statements perform an action only if the specified condition is met.
There are also several other control flow statements (such as loops) which use legacy syntax similar to commands.
Commands
A command is an instruction to carry out a specific predefined action. «Command» may also refer to a specific predefined action, such as MsgBox. The set of available commands is predefined and cannot be changed by the script.
A command is called simply by writing its name at the beginning of a line, optionally followed by parameters. For example:
The comma separating the command name from its parameters is optional, except in the following cases:
When it’s necessary to prevent the line from being interpreted as a legacy assignment or assignment expression.
When the first parameter is blank.
When the command is alone at the top of a continuation section.
Each parameter of a command may accept different syntax, depending on the command. There are four types of parameters:
In most cases the percent prefix can be used to pass an expression.
OutputVar and InputVar Parameters
OutputVar and InputVar parameters require a variable name or dynamic variable reference. For example:
This command reads the value from OldStr (the InputVar) and stores the result in NewStr (the OutputVar).
Note: Only a plain variable can be used as an OutputVar. Array elements, properties and other expressions are not supported.
InputVar parameters can accept an expression only when the percent prefix is used. However, the prefix is not supported in the Var parameters of legacy If commands, so If (expression) should be used instead.
Text Parameters
Text parameters accept unquoted text. For example:
Since commas and percent signs have special meaning, use the escape sequence `, to specify a literal comma and `% to specify a literal percent sign. For clarity, it is best to always escape any comma which is intended to be literal, but escaping comma is optional in the following cases:
Text parameters can also accept a forced expression.
Numeric Parameters
Numeric parameters accept a literal number or an expression, and can be identified by phrasing like «This parameter can be an expression.»
For historical reasons, simple variable references alone or combined with digits are not interpreted as expressions. For example:
To perform a double-deref in such cases, enclose the expression in parentheses: Sleep (%m%)
Numeric parameters allow and ignore the percent prefix.
% Expression
Although purely numeric parameters accept an expression by default, all other parameters of commands do not. Specify a percent sign followed by a space or tab to force a parameter to accept an expression. For example, all of the following are effectively identical because Sleep’s first parameter is expression-capable:
Note: Using the percent-space prefix in a numeric parameter does not necessarily force it to be an expression.
All parameters support the percent-space prefix except for:
Some users may find it easier to always force an expression, keeping to one consistent syntax (expression syntax) as much as possible.
Documentation Conventions
At the top of each page which documents a command, there is usually a block showing syntax, like this:
The square brackets denote optional parameters; the brackets themselves must be omitted from the actual code.
Sometimes the value a parameter accepts is written directly in the syntax block. For example, the third parameter of StringLower shown above accepts the letter T as text. The exact usage of a parameter is described in the Parameters section, and varies between commands.
Optional Parameters
Optional parameters can simply be left blank. The comma preceding an optional parameter can also be omitted if all subsequent parameters are omitted. For example, the Run command can accept between one and four parameters. All of the following are valid:
Expressions vs Legacy Syntax
Many command parameters do not accept expressions by default. Use the percent-space prefix at the beginning of a parameter to evaluate that parameter as an expression. In the following examples, the expression is shown on the first line (beginning after the percent sign), with pure legacy syntax shown on the second line.
Literal text in an expression is always enclosed in quote marks. These are called quoted strings.
Variables in an expression are never enclosed in percent signs, except to create a double reference.
Variables cannot be used inside a quoted string.
Instead, values are concatenated by writing them in sequence, separated by a space or tab, or a dot surrounded by spaces.
One alternative is to use the Format function, which can also format the parameter value in various ways.
A value is assigned to a variable with := instead of = :
In an expression, both values can be simple values or complex sub-expressions. A comparison can also be combined with other conditions using operators such as and and or (which are equivalent to && and || ).
Different Equals
One common mistake is to write = where := is needed. For example:
This can be difficult to avoid (at least until such time as the legacy assignment syntax is removed), but it may help to always use := where an assignment is intended.
The equal sign (when not used with another symbol, such as ) has the following meanings:
The first two cases can be avoided by always using the := assignment operator and if (expression).
Commands vs Functions
In AutoHotkey v1, it is currently not possible to call a command from an expression, or to call a function using the command syntax. However, several commands have a function replacement.
Control Flow Statements
For a general explanation of control flow, see Control Flow.
The following control flow statements exist:
Control Flow vs Commands
Control flow statements have syntax resembling commands, and are often referred to as such, but some differ from commands:
If Statement
If (expression) evaluates an expression and executes the following statement only if the result is true.
Common cause of confusion: There are several other types of If statements, some of which look very similar to If (expression). These should be avoided in new scripts. If in doubt, it is best to always begin the expression with an open-parenthesis. The «legacy» If statements are as follows:
Any If statement which does not match one of the usages shown above is interpreted as If (expression).
These are some common points of confusion related to legacy If statements:
The following «legacy» named If statements also exist:
With the exception of IfMsgBox, these are all obsolete and generally should be avoided in new scripts.
Named If statements allow a command to be written on the same line, but mispelled command names are treated as literal text. Such errors may be difficult to detect.
Loop Statement
There are several types of loop statements:
Break exits (terminates) a loop, effectively jumping to the next line after the loop’s body.
Continue skips the rest of the current loop iteration and begins a new one.
Until causes a loop to terminate when an expression evaluates to true. The expression is evaluated after each iteration.
A label can be used to «name» a loop for Continue and Break. This allows the script to easily continue or break out of any number of nested loops without using Goto.
The built-in variable A_Index contains the number of the current loop iteration. It contains 1 the first time the loop’s body is executed. For the second time, it contains 2; and so on. If an inner loop is enclosed by an outer loop, the inner loop takes precedence. A_Index works inside all types of loops, but contains 0 outside of a loop.
For some loop types, other built-in variables return information about the current loop item (registry key/value, file, substring or line of text). These variables have names beginning with A_Loop, such as A_LoopFileName and A_LoopReadLine. Their values always correspond to the most recently started (but not yet stopped) loop of the appropriate type. For example, A_LoopField returns the current substring in the innermost parsing loop, even if it is used inside a file or registry loop.
Loop variables can also be used outside the body of a loop, such as in a function or subroutine which is called from within a loop.
Not Control Flow
As directives, labels (including hotkeys and hotstrings), and declarations without assignments are processed when the script is loaded from file, they are not subject to control flow. In other words, they take effect unconditionally, before the script ever executes any control flow statements. Similarly, the #If directives such as #IfWinActive cannot affect control flow; they merely set the criteria for any hotkey labels and hotstrings specified in the code. A hotkey’s criteria is evaluated each time it is pressed, not when the #If directive is encountered in the code.
Structure of a Script
Auto-execute Section
After the script has been loaded, it begins executing at the top line, continuing until a Return, Exit, the script’s first hotkey/hotstring label, or the physical end of the script is encountered (whichever comes first). This top portion of the script is referred to as the auto-execute section, but it is really just a subroutine which is called after program startup.
Note: While the script’s first hotkey/hotstring label has the same effect as return, other hotkeys and labels do not.
The auto-execute section is often used to configure settings which apply to every newly launched thread. For details, see The Top of the Script.
Subroutines
A subroutine (or sub) is a reusable block of code which can be called to perform some task.
Scripts use subroutines to define what should happen when a particular hotkey is pressed or some other event occurs. Scripts can also call subroutines directly, by using Gosub.
Any label can be used as the starting point of a subroutine. A subroutine has no explicitly marked ending point, but instead ends if and when control is returned to the subroutine’s caller by Return or when the thread is exited. For example:
Note that as labels have no effect when reached during normal execution, in this example a message box would be shown twice: once while the subroutine is running and again after it returns. One important consequence is that you cannot define one subroutine inside another subroutine, because the «body» of the inner subroutine would execute automatically and then return, effectively terminating the outer subroutine.
Subroutines should typically be defined separately to any other block of code, but can also be defined inside a function, allowing the subroutine access to that function’s static variables (and local variables, but only while the function is running).
Note: Subroutines defined inside a function have certain limitations regarding the use of local variables and dynamic variable references, including Gui control variables. For details, see Using Subroutines Within a Function.
User-Defined Functions
Generally speaking, a function is a kind of subroutine. However, within the AutoHotkey documentation, «subroutine» typically refers to the kind of subroutine defined by a label (described above).
User-defined functions differ from subroutines in that they can accept parameters and return a value, and they can have local variables. They can be called either by a function call within the script or by the program itself, such as if a function was passed to the Hotkey or SetTimer commands.
Functions are defined using syntax resembling a function call followed by a block of code enclosed in braces:
As with function calls, there must be no space between the function name and open-parenthesis.
The line break between the close-parenthesis and open-brace is optional. There can be any amount of whitespace or comments between the two.
ByRef indicates that the parameter accepts a variable reference, making that parameter an alias for whichever variable the caller passes. If the caller does not pass a variable, the parameter acts as a normal local variable. ByRef parameters can also be optional.
The function can return a value. If it does not, the default return value is an empty string.
A function cannot be defined inside another function. Otherwise, the position of a function definition does not matter; any function defined within the script can be called from anywhere else.
See Functions for much more detail.
#Include
The #Include directive causes the script to behave as though the specified file’s contents are present at this exact position. This is often used to organise code into separate files, or to make use of script libraries written by other users.
Note: The following paragraphs detail some common points of confusion.
When using #Include, it is important to consider what effect the file’s contents would have if placed at that position, since #Include will have the same effect. For instance:
#Include generally should not be used in the middle of a subroutine or function.
The script only has one auto-execute section, not one per file.
#Include can be safely used within the auto-execute section to include files which contain only function definitions, since function definitions (but not function calls) are skipped over during execution. If a file contains other code, one can avoid breaking the auto-execute section by skipping over the file’s contents with Goto.
Unlike in C/C++, #Include does nothing if the file has already been included by a previous directive. To include the contents of the same file multiple times, use #IncludeAgain.
Script files containing functions can be automatically included without having to use #Include, if they are saved in a standard location and named appropriately. The effect is similar to using #Include at the end of the main script file. For details, see Libraries of Functions.
Miscellaneous
Dynamic Variables
A dynamic variable reference takes a text value and interprets it as the name of a variable.
The most common form of dynamic variable reference is called a double reference or double-deref. Before performing a double reference, the name of the target variable is stored in a second variable. This second variable can then be used to assign a value to the target variable indirectly, using a double reference. For example:
At first, it would appear that percent signs have a different meaning depending on whether they are used in text or in an expression. However, it may make more sense to think of %second% as being replaced with the contents of the variable second in both cases:
Currently, second must always contain a variable name in the second case; arbitrary expressions are not supported.
For a description of how dynamic variable references inside functions are resolved, see Functions: More about locals and globals.
Pseudo-arrays
A pseudo-array is actually just a bunch of discrete variables, but with a naming pattern which allows them to be used like elements of an array. For example:
As the individual elements are just normal variables, one can assign or retrieve a value, but cannot remove or insert elements. Because the pseudo-array itself doesn’t really exist, it can’t be passed to or returned from a function, or copied as a whole. For these reasons, it is generally recommended to use normal arrays instead, where possible.
Associative pseudo-arrays
The «index» used to form the final variable name does not have to be numeric; it could instead be a letter or keyword, making the pseudo-array similar to an associative array or an object. The following example creates a pseudo-array with elements «Left», «Top», «Right» and «Bottom»:
Commands which create pseudo-arrays
There are several commands which create associative pseudo-arrays:
Caution: These commands do not follow the same rules as dynamic variable references. If used within a function, the resulting pseudo-array is either entirely global or entirely local, depending only on the first element (or base name) of the array. Some of the variables in the pseudo-array may be inaccessible if they are not individually declared. For details, see Functions: More about locals and globals.
AutoHotkey also creates one global pseudo-array to contain any command line parameters that were passed to the script.
Labels
A label identifies a line of code, and can be used as a Goto target or to form a subroutine. There are three kinds of label: normal named labels, hotkey labels and hotstring labels.
Normal labels consist of a name followed by a colon.
Hotkey labels consist of a hotkey followed by double-colon.
Hotstring labels consist of a colon, zero or more options, another colon, an abbreviation and double-colon.
Generally, aside from whitespace and comments, no other code can be written on the same line as a label. However:
Каждый скрипт представляет собой простой текстовый файл, содержащий команды, которые затем будет исполнять программа (AutoHotkey.exe). Скрипт также может содержать горячие клавиши и строки автозамены, и даже полностью состоять из них. Однако, в отсутствие горячих клавиш и строк автозамены, после запуска скрипта его команды исполняются последовательно друг за другом сверху донизу.
При запуске скрипты оптимизируются и проверяются. Сообщения об ошибках выводятся на экран. Скрипт может быть запущен (будет работать) только после их исправления.
Содержание
Секция авто-выполнения: автоматически исполняемая верхняя секция скрипта.
Escape-последовательности: использование символов `% и `, для указания на буквальные знаки процента или запятой.
Комментарии в скриптах: использование точки с запятой и символов /*. */ для добавления в скрипт примечаний.
Разбивка длинных строк на ряд более коротких: повышает удобство чтения и эксплуатации скрипта.
Отладка скрипта: как найти ошибки в неправильно работающем скрипте.
Секция авто-выполнения
Программа, строка за строкой, загружает скрипт в память (каждая строка может содержать до 16 383 символов). После загрузки программа исполняет скрипт до тех пор, пока не дойдет до команд Return, Exit, метки горячей клавиши или строки автозамены, или конца скрипта (в зависимости от того, что стоит первым). Эта верхняя часть скрипта называется секцией авто-выполнения.
Не завершающий работу автоматически и не содержащий горячие клавиши и строки автозамены скрипт заканчивает свою работу после окончания секции авто-выполнения. Иначе, он будет работать в состоянии ожидания, реагируя на такие события, как запуск горячих клавиш и строк автозамены, события GUI, вызов элементов пользовательского меню и таймеры.
Каждый поток, запущенный горячей клавишей, строкой автозамены, вызовом элемента меню, событием GUI или таймером, непосредственно после запуска начинает исполняться, используя значения по умолчанию для указанных далее параметров, как задано в секции авто-выполнения. Если значения не заданы, будут использованы стандартные значения по умолчанию (как описано в документации для каждой из следующих команд): DetectHiddenWindows, DetectHiddenText, SetTitleMatchMode, SetBatchLines, SetKeyDelay, SetMouseDelay, SetWinDelay, SetControlDelay, SetdefaultMouseSpeed, CoordMode, SetStoreCapslockMode, AutoTrim, SetFormat, StringCaseSense, Thread, and Critical.
Если для завершения работы секции авто-выполнения требуется много времени, (или если секция никогда не завершается), через 100 миллисекунд вступают в действие значения по умолчанию приведенных выше параметров настройки. Таким образом, обычно лучшим решением для скриптов, содержащих горячие клавиши, строки автозамены, таймеры или элементы пользовательского меню, является внесение желаемых изменений в значения по умолчанию в верхней части этих скриптов. Обратите также внимание, что каждый поток сохраняет свой собственный набор упомянутых выше параметров настройки. Изменения, сделанные в этих параметрах, не повлияют на другие потоки.
Escape-последовательности
В AutoHotkey escape-символом по умолчанию является знак акцента (`), находящийся в верхнем левом углу большинства английских клавиатур. Использование этого символа вместо обратного слеша устраняет необходимость в двойном обратном слеше в пути и имени файла.
Также с помощью escape-последовательности задаются специальные символы. Чаще всего это `t (табуляция), `n (перевод строки) и `r (возврат каретки).
Комментарии
В скрипте можно добавлять комментарии в начале строки после точки с запятой. Например:
Также комментарии можно вставлять после команды. В этом случае перед точкой с запятой должен быть хотя бы один пробел или табуляция. Например:
Кроме того, можно использовать символы /* и */, чтобы закомментировать целый раздел. Однако в этом случае символы должны ставиться в начале строки, как показано в следующем примере:
Совет: можно опустить первую запятую в любой команде. Например:
Разбивка длинных строк на ряд более коротких
Чтобы повысить удобство чтения и эксплуатации скрипта, можно разбить длинные строки на совокупность более коротких. Такая разбивка не уменьшает быстродействие, так как в момент запуска скрипта разделенные строки объединяются в памяти.
Способ №1 [v1.0.35.03+]: cтрока, начинающаяся с «and», «or», ||, &&, запятой или точки автоматически объединяется со строкой, находящейся непосредственно выше нее. В следующем примере вторая строка объединяется с первой, так как начинается с запятой.
Подобным образом приведенные ниже строки сольются в одну, так как две последние строки начинаются с «and» или «or»:
Способ №2 [v1.0.32+]: этот метод используется для объединения большого количества строк, или если строки нельзя объединить с помощью способа №1. Хотя данный способ предназначен главным образом для простой автозамены, его можно использовать также для любой команды или выражения. Например:
В приведенном примере ряд строк, ограниченных сверху и снизу парой круглых скобок, называется секцией продолжения. Обратите внимание, что нижняя строка после закрывающей скобки содержит последний параметр FileAppend. Этот параметр ставится по желанию: в данном примере это сделано, чтобы запятая была продемонстрирована как ограничитель параметра, а не как буквальная запятая.
Поведение по умолчанию секции продолжения можно изменить, если справа от открывающей скобки секции добавить одну или несколько приведенных ниже опций. Каждая опция отделяется от предыдущей пробелом. Например: ( LTrim Join| %
RTrim0 (RTrim + цифра 0): выключает пропуск пробелов и табуляции в конце каждой строки.
% (знак процента): трактует знак процента как буквальный, а не как ссылку на переменную. Устраняет необходимость экранировать каждый знак процента. Данная опция не нужна там, где знак процента уже является буквальным (например, в простой автозамене).
, (запятая): трактует запятые как ограничители, а не как буквальные запятые. Эта редко используемая опция нужна только для запятых между параметрами команд, так как в вызовах функций тип запятой не имеет значения. Таким образом, данная опция преобразует только те запятые, которые фактически ограничивают параметры. Другими словами, как только достигнут последний параметр команды (или если в команде параметры не заданы), идущие следом запятые трактуются как буквальные.
` (акцент): трактует каждый символ акцента буквально, а не как escape-символ. Эта опция также исключает экранирование запятых и знаков процента явно и по отдельности. Кроме того, опция исключает преобразование любой заданной явно escape-последовательности, как `r or `t.
Секция продолжения поддерживает такие escape-последовательности, как `n (перевод строки) and `t (табуляция), кроме случаев, когда задана опция (`) (акцент).
Секция продолжения не поддерживает комментарии (точка с запятой и /*..*/), так как рассматривает их как буквальный текст. Однако комментарии можно добавить в верхней и нижней строках секции продолжения. Например:
Как видно из примера, экранировать точки с запятой в секции продолжения нет никакой необходимости.
Закрывающая скобка обозначает конец секции продолжения, поэтому чтобы начать строку с буквальной закрывающей скобки, нужно поставить перед ней символ акцента.
Формирование секции продолжения из нескольких частей с помощью команды #Include не поддерживается.
За секцией продолжения может сразу идти строка, содержащая открывающую скобку другой секции продолжения, что позволяет в процессе создания единой строки изменять опции, описанные выше.
Мобильность AutoHotkey.exe
Конвертация скрипта в исполняемый файл EXE (ahk2exe)
После конвертации скрипт становится самостоятельным исполняемым файлом, то есть его можно запустить даже на тех компьютерах, где программа AutoHotkey не установлена (такие exe-файлы можно распространять без ограничений). В процессе компиляции скрипт, все входящие в него файлы и те файлы, которые были включены (добавлены) в результате исполнения команды FileInstall, сжимаются и зашифровываются.
Компиляция не увеличивает быстродействие скрипта. На практике, скомпилированный скрипт работает даже слегка медленнее, поскольку сначала его необходимо декодировать и распаковать в память, а уже потом оптимизировать, как обычный скрипт.
Ahk2Exe можно запустить следующим образом:
Передача скрипту параметров командной строки
Скрипты поддерживают параметры командной строки в следующем формате:
Для скомпилированных скриптов формат такой:
Параметр Switches может быть нулевым или иметь одно из следующих значений:
Параметр Script Filename можно опустить, если параметров скрипта нет. Если параметр Script Filename опущен, то будет запущен файл AutoHotkey.ini в текущей рабочей директории (или пользователю будет предложено его создать 1 ).
В качестве Script Parameters может быть любая строка, которую вы хотите передать скрипту (строку, содержащую пробелы, необходимо заключить в двойные кавычки). Скрипт рассматривает входящие параметры как переменные %1%, %2%, и так далее. Кроме того, переменная %0% содержит количество переданных параметров (0, если никаких параметров не передано). Следующий пример прерывает исполнение скрипта, если передано слишком мало параметров:
Русские Блоги
Официальное руководство AutoHotkey (1) руководство для начинающих
1-Базовый
Прежде чем мы начнем наше путешествие, позвольте мне дать вам несколько предложений. В этом руководстве вы увидите много текста и много кода. Для более эффективного обучения рекомендуется прочитать эти тексты ипытатьсяКод. Затем вы сможете узнать больше о коде. Вы можете скопировать и вставить большинство примеров на этой странице. Если вы запутались, попробуйте прочитать его еще раз.
а. Загрузите и установите AutoHotkey.
Прежде чем научиться использовать AutoHotkey (AHK), вам необходимо его загрузить. После загрузки вам может потребоваться установить его. Но это зависит от версии, которую вы скачали. В этом руководстве мы будем использовать установленную версию, потому что для новичков она Самый простой в настройке.
Текстовое руководство:
б. Как создать сценарий
Текстовое руководство:
Щелкните правой кнопкой мыши пустое место на рабочем столе.
Щелкните меню «Новый».
Щелкните внутри «AutoHotkey Script», чтобы создать новый сценарий.
Найдите только что созданный сценарий и щелкните его правой кнопкой мыши.
Щелкните «Редактировать сценарий».
Появится новое окно, может быть, Блокнот. Если да, то получилось!
Теперь, когда вы создали сценарий, нам нужно что-то добавить в сценарий. Если вам нужно использовать встроенные команды, функции и переменные, пожалуйста, отметьтеРаздел 5.
Это использованиеSend Команда создает простой сценарий, содержащий горячие клавиши. Когда вы нажимаете горячую клавишу, она отправляет текст в окно.
Позже мы проведем более подробное исследование. Перед этим давайте объясним приведенный выше код:
Дважды щелкните файл на рабочем столе, чтобы запустить его, откройте Блокнот или другое место, где вы можете ввести текст, и нажмите Ctrl и J.
Отлично! Ваш первый сценарий готов. Дайте себе вознаграждение, а затем вернитесь и прочтите оставшуюся часть этого руководства.
c. Не комбинируйте команды
Когда вы пишете код, у вас может возникнуть сильное побуждение поместить несколько команд в одну строку или вложить несколько команд в одну команду. Не делайте этого.Раздел 5Мы расскажем, почему этого не делать, а заодно подскажем, что делать.
г. Как найти файлы справки на вашем компьютере
Есть несколько способов сделать это, если вы установили AutoHotkey в папку по умолчанию:
2-горячие клавиши и горячие строки
Что такое строки быстрого доступа? Когда вы их вводите, строки быстрого доступа в основном используются для раскрытия сокращений (автоматическая замена). Конечно, их также можно использовать для запуска любого действия сценария. Например:
Разница между этими двумя примерами в том, что когда вы нажимаете Ctrl + J, горячая клавиша срабатывает, и горячая строка преобразует введенный вами ftw в «Free the whales».
заметка:: Конечно, есть исключения, но во многих случаях это легко вызвать путаницу, поэтому это не будет описано на странице мастера, по крайней мере, сейчас.
У горячей строки есть пара символов :: на каждой стороне текста, который будет запускаться. Замененный текст находится во второй паре ::правильно.
Как упоминалось выше, горячие строки также могут инициировать действия по сценарию. Они могут делать много чего, например горячие клавиши, здорово!
Хорошая новость: вы можете написать несколько строк кода для каждой горячей клавиши, строки быстрого доступа, метки и т. Д.
а. Ключ и его загадочные символы
условное обозначение | описание |
---|---|
# | Win (клавиша с логотипом Windows) |
! | Alt |
^ | Control |
+ | Shift |
& | Используется для соединения двух кнопок (включая кнопки мыши) и объединения их в одну настраиваемую горячую клавишу. |
(Полный список символов см. На странице горячих клавиш)
Кроме того, двойные двоеточия можно использовать для горячих клавиш для всех / большинстваслеваИмя горячей клавиши, см.Список ключей.
Вы можете использовать между двумя кнопками (кроме кнопки ручки) & Чтобы определить комбинацию горячих клавиш. В следующем примере вам нужно нажать Numpad0, а затем нажать Numpad1 или Numpad2, чтобы вызвать горячую клавишу:
Для получения дополнительной информации и примеров горячих клавиш и модификаторов строки автоответчика посетите:Горячая клавишас участиемГорячая струна.
б. Горячие клавиши / строки быстрого доступа для конкретных окон
Иногда вам может потребоваться, чтобы горячие клавиши или строки быстрого доступа работали только в определенных окнах (или отключили их). Для этого вам нужно использовать любую из этих «расширенных» команд с символом # перед ними:
Эти специальные команды (технически называемые «командами») могут создавать контекстно-зависимые горячие клавиши и строки быстрого доступа. Вам нужно только указать заголовок окна. Но в некоторых случаях вам может потребоваться указать дескриптор окна, группу или класс. Если вы хотите чтобы узнать больше об этом расширенном содержании, нажмите здесь:#IfWinActive.
Чтобы отключить контекстную чувствительность последующих горячих клавиш или строк быстрого доступа, укажите любую команду #IfWin, но оставьте все ее параметры пустыми. Например:
Когда команда #ifwin никогда не используется в сценарии, все горячие клавиши и строки быстрого доступа действуют для всех окон.
Директивы #IfWin связаны с позицией: они влияют на все горячие клавиши и строки быстрого доступа между ними в скрипте.Они также являются взаимоисключающими, то есть эффективна только ближайшая из них.
Для получения дополнительной информации и похожих команд, пожалуйста, проверьте:#IfWinActive страница.
c. Файл содержит несколько горячих клавиш / строк быстрого доступа.
Это идея некоторых людей. Поэтому я заявляю: AutoHotkey можетТак много Горячие клавиши и горячие строки помещаются в один файл, неважно 1 или 3253 (или больше).
Приведенный выше код полностью приемлем.В одном большом файле сценария содержится несколько горячих клавиш, несколько горячих клавиш.
г. Пример
3-кнопка отправки
Но прежде чем мы будем готовы использовать Send, необходимо знать о некоторых типичных проблемах.
Как и горячие клавиши, команда Отправить также имеет несколько специальных клавиш. Вот 4 наиболее распространенных специальных клавиши:
На странице отправки большая таблицаОтображает почти все специальные клавиши, встроенные в AHK. Нажмите, чтобы просмотреть. Например:
предостережение: Этот столНеПрименить кГорячая клавишаТо есть, когда вы используете Ctrl или Enter (или другие клавиши) в качестве горячих клавиш, не заключайте их в ().
На примере показано, что нельзя делать с горячими клавишами:
У многих есть общая проблема. Они думают, что фигурные скобки используются в документе только для развлечения. На самом делеФигурные скобки необходимы. Это скажет AutoHotkey Означает «восклицательный знак», а не «нажать Alt». Так что смотрите внимательно.Send Для таблицы специальных ключей на странице не забудьте добавить фигурные скобки там, где это необходимо. Например:
Другая распространенная ошибка заключается в том, что люди думают, что при использовании команды ОтправитьВсе содержаниеВсем нужно добавить фигурные скобки.Это неправильно.Если этого нет в специальном списке ключей, нет необходимости добавлять фигурные скобки.Не делайтеВам нужно добавить круглые скобки к обычным символам, числам и даже символам, таким как (точка). Кроме того, когда вы используете команду Отправить, вы можете отправлять сразу несколько символов, цифр или символов. Таким образом, нет необходимости писать команду отправки для каждого символа. Например:
Если вы хотите указать, что нужно нажать или отпустить клавишу, вы можете заключить ее в фигурные скобки и добавить слово UP или DOWN. Например:
Теперь вы можете подумать,«Как я могу обеспечить читаемость текста при отправке очень длинного текста?». Очень просто. Используйте то, что мы называем продолжением сегмента. Просто укажите открывающую скобку на новой строке, затем содержимое и, наконец, добавьте закрывающую скобку на отдельной строке. Для получения дополнительной информации прочтитеПродолжение разделов.
заметка: Существует несколько различных форм команды «Отправить». Каждая форма имеет свои особенности. Если одна форма команды «Отправить» не соответствует вашим требованиям, вы можете попробовать другую форму. Просто замените команду «Отправить» следующей: A: SendRaw, SendInput, SendPlay, SendEvent. Хотите знать подробности каждой команды,Пожалуйста, прочтите здесь.
а. Игры
Очень важно: Многие игры, особенно новые, имеют античит-системы, такие как GameGuard, Hackshield, PunkBuster и т. Д. Не говоря уже о том, что обход античит-системы противоречит правилам игры, а обойти сам античит непросто. достичь.
Если античит-система игры приводит к сбою горячих клавиш, горячих строк и команд отправки, вам не повезло. Тем не менее, есть несколько способов улучшить возможность использования горячих клавиш в некоторых играх, ноНикто не может упаковать билетыИтак, попробуйте, если возможновсеКак вы думаете, не сдавайтесь легко.
Также есть вопрос о DirectX. Если у вас возникнут проблемы с использованием AutoHotkey в играх DirectX, попробуйтеFAQ Ситуация описана на странице. При использовании команд PixelSearch, PixelGetColor или ImageSearch вы можете столкнуться с дополнительными проблемами с DirectX. Цвет экрана может стать черным (0x000000) независимо от того, какой цвет вы установили. Если это возможно, попробуйте запустить игра в оконном режиме, что может решить некоторые проблемы DirectX.
Не существует универсального способа гарантировать, что AutoHotkey может работать во всех программах. Если вы все равно не справитесь с попыткой всех методов, возможно, AutoHotkey временно не сможет удовлетворить ваши потребности.
4-Открыть программу и веб-страницу
Хотите открыть такие вещи, какКраска (mspaint.exe), калькулятор (calc.exe), script.ahk Или папку, вы можете использоватьRun Команда. Вы также можете использовать эту команду, чтобы открыть URL-адрес, напримерhttps://autohotkey.com/.Если вы хотите открыть уже установленную программу, это тоже очень просто, например:
Есть и другие расширенные функции, такие как параметры командной строки и CLSID (идентификатор класса Windows).
Вот несколько примеров команд «Выполнить»:
Для получения дополнительной информации и примеров, пожалуйста, проверьте:Run страница.
5 команд и функций
У AutoHotkey есть два важных инструмента для разработчиков: команды и функции.
Список всех команд и встроенных функций можно найти вВотповерни.
команда
Вы можете различать команды и функции по синтаксису. В параметрах после команды не обязательно использовать скобки, но функции должны использоваться. Итак, команда выглядит так:
Когда вы используете команды, вы не можете поместить несколько команд в одну строку (IfEqual Кроме). Также невозможно вставить команду в качестве параметра в другую команду. Например:
В отличие от функций, команды используют «традиционный синтаксис». Другими словами: когда вы используете параметр Когда, вам нужно добавить% до и после параметра, например %variable% Текст и цифры цитировать не нужно. This is some text Кроме того, в отличие от функций, параметры команд нельзя оперировать.
Если вы действительно хотите произвести расчеты в параметрах, вы можете использовать один % Для принудительного определения выражения, но мы не будем рассматривать это здесь.
функция
Как упоминалось выше, разница между функциями и командами состоит в том, что для функций требуются круглые скобки. Типичная функция выглядит так:
По сравнению с командами функции имеют следующие основные отличия:
Вы можете использовать операции.
Перед параметром и после него нет необходимости добавлять знак процента:
Функции могут включать другую функцию:
Перед текстом и после него необходимо добавить двойные кавычки:
Функции обычно возвращают значение, отличное от команд. Команды должны быть установленыOutputVar Параметры используются для сохранения результатов, но функции не нужны. Самый распространенный способ присвоить значения функции переменным, просто выполните:
Это не единственный метод присваивания, но он наиболее часто используется. MyVar используется для хранения возвращаемого значения функции, которое записывается в правой части оператора: =. Для получения дополнительной информации см.функциястраница.
а. Блок кода
Блок кодаСтоит использовать пару фигурных скобок ( <с участием >) Окруженный фрагментом кода, AutoHotkey использует его, чтобы судить, что эти коды представляют собой единое целое. Часто используются блоки кода.If с участием Loop Средний. Если вы не используете фигурные скобки, может быть выполнена только первая строка кода во всем блоке кода.
В следующем коде, когдаMyVar Когда он равен 5, все строки будут выполнены.
В следующем коде, когда MyVar равно 5, может отображаться окно сообщения. Но независимо от того, равно ли MyVar 5, сценарий завершится:
Если с ним связана только одна строка кода, следующий пример представляет собой очень хорошую демонстрацию написания кода. Он реализует ту же функцию, что и приведенный выше код, но я сделал отступ во второй строке кода, поэтому напишите это так. Это просто чтобы знать, что эта строка кода связана с If:
6-переменный
переменнаяЭто как информационный листок. Его можно использовать в функциях, командах или математических выражениях для хранения текста, чисел и данных. Без переменных программы и скрипты будут очень скучными.
Есть много способов присвоить значения переменным, мы обсудим самые распространенные из них. Обратите особое внимание на знак равенства ( = ).
Традиционное назначение текста
Это самый простой способ присвоить значение переменной, и это также традиционный метод присвоения. Просто введите текст после знака равенства.
Традиционное присвоение переменных
Он аналогичен описанному выше методу, за исключением того, что вы присваиваете значение, соответствующее одной переменной, другой переменной.
Традиционное смешанное назначение
MyVar = %MyVar2% some text %MyVar3%.
Сочетание двух вышеперечисленных традиционных заданий.
Назначение текста выражения
Это присвоение выражения, потому что : В = Раньше. Любой текст должен быть в кавычках.
Назначение переменной выражения
В режиме выражения переменная не требует знака процента.
Присвоение номера выражению
Благодаря выражению можно посчитать!
Смешанное присвоение выражений
MyVar := «The value of 5 + » MyVar2 » is: » 5 + MyVar2
Комбинация трех вышеуказанных назначений выражений.
а. Когда использовать знак процента
Когда использовать знак процента:
когдаНе надоИспользуйте знаки процента:
Входные или выходные переменные в параметрах. Например: StringLen, **OutputVar**, **InputVar**
Переменные слева во время присваивания: Например: **Var** = 123abc
В традиционном операторе If (исключая выражения) переменная слева от середины: If Var1
Переменные в выражениях, например:
б. Получение пользовательского ввода
c. Другие примеры
7-объект
ОбъектЭто способ организации данных для более эффективного использования. Иногда объекты обрабатываются как массивы, вот важное утверждение, что все массивы являются объектами. Различные вещи, которые мы называем объектами, зависят от цели, для которой мы их используем, но все объекты Это все так же.
Нет никаких ограничений на то, какими могут быть ключи и значения объекта. Они могут быть даже другим массивом! Если значение объекта также является массивом, мы называем этоВложенный массив, Мы объясним это позже.
Вы можете захотеть использовать объекты по многим причинам, например:
а. Создание объектов
У нас есть много способов создания объектов, вот наиболее часто используемые:
Синтаксис квадратных скобок
MyObject := [«one», «two», «three», 17]
Синтаксис фигурных скобок
MyObject := Array(«one», «two», «three», 17)
Этот метод аналогичен синтаксису квадратной скобки, разница только в форме функции.
Banana := Object(«Color», «Yellow», «Taste», «Delicious», «Price», 3)
Этот метод аналогичен синтаксической форме фигурных скобок, разница только в форме функции.
Обратите внимание, что все эти методы создают одно и то же (то есть объект), с той лишь разницей, что ключи у объекта разные.
б. Используйте объект
Есть много способов использования объектов, включая получение значений, установку значений, добавление дополнительных значений и т. Д.
Настройки:
Обозначение квадратных скобок
Установить значение в объекте так же просто, как задать значение переменной. Что вам нужно сделать, так это поместить значение, представленное квадратными скобками, в оператор присваивания выражения. := Слева.
То же, что и выше, но с точкой (.).
Получение значения:
Обозначение квадратных скобок
В качестве имени ключа можно использовать только исходную строку. Переменные нельзя использовать в имени ключа в виде точки.
Добавьте новые ключи и значения:
Обозначение квадратных скобок
Чтобы напрямую добавить пару ключей и значений, вам нужно только установить ключ, который еще не существует.
То же, что и выше, но с точечным обозначением.
MyObject.InsertAt(Index, Value1, Value2, Value3. )
ИндексЛюбой целочисленный ключ. Это переместит индекс всех более высоких целочисленных ключей вверх на количество вставленных значений, даже если они свободны (например, предполагая, что существуют только ключи 1 и 100, при вставке значения в 50-ю позицию ключа, приведет к тому, что индекс ключа 100 станет 101).
MyObject.Push(Value1, Value2, Value3. )
«Добавить» значения в массивMyObject Другими словами, он помещает вставленное значение в позицию самого высокого целочисленного ключа + 1.
Удалите ключи и значения:
Заполните значения пробелами
RemovedValue := MyObject.Delete(AnyKey) Этот и следующий метод удалит ключс участием Значение. MyObject[AnyKey] Предыдущее значение будет сохранено вRemovedValue в. NumberOfRemovedKeys := MyObject.Delete(FirstKey, LastKey) Разрешить удалитьFirstKey с участием LastKey Последовательность чисел / целых чисел или строковых ключей между ними. Значение, которое она дает, будет количеством ключей, которые были удалены. Это полезно, если между вашими ключами есть промежутки (например, вы указываете ключи от 1 до 4, но ключ 2 не существует, это установитNumberOfRemovedKeys Это 3, потому что были удалены только три ключа).
MyObject.Pop() Это удалит самый высокий целочисленный ключ и вернет значение, соответствующее этому ключу. И эта форма не повлияет на порядок индекса других ключей (потому что нет более высокой последовательности, чем она).
8-другие полезные вещи
Дорогой друг, когда ты это читаешь, это означает, что наше путешествие подходит к концу. Надеюсь, ты кое-что приобрел. Наконец, я расскажу тебе кое-что, что, на мой взгляд, может быть полезно для тебя. Надеюсь, ты хорошо проводишь время!
а. Таинственный []
В справочном документе вы можете найти два символа ( [ с участием ] ) Часто появляется в желтом поле кода в начале почти каждой страницы. Содержимое в квадратных скобках представляетНеобязательныйДругими словами, если вам не нужны эти параметры, вы можете игнорировать их. Но важно отметить, что при написании кода вы должныНе надоПоложите [] также на него.
p> Например, в ControlGetText На странице команд вы можете увидеть этот код:
Так что вы можете просто написать это:
Или добавьте детали:
Если вы хотите использовать только параметр ExcludeTitle и не хотите использовать параметрWinText Или жеWinTitle, Что делать? Очень просто!
б. Найдите свою версию AHK
Вы можете запустить следующий код, чтобы просмотреть информацию о версии AHK:
Вы также можете перейти в меню «Пуск» или в файл справки (эта статья) по пути установки, чтобы найти его.
c. Методом проб и ошибок
Если вы столкнулись с ошибкой в процессе пробования чего-то нового, это не имеет значения, начните с устранения ошибки. Попробуйте исправить ошибку, если она не удалась, вы не сможете решить ее дважды. После многих попыток вы можете ‘ t решить эту проблему. Вы можете открыть файл справки, чтобы узнать, что можно сделать, а что нельзя, затем измените свой код и попробуйте еще раз. Попробуйте, потерпите неудачу, попробуйте, неудачно, попробуйте, попробуйте, попробуйте еще раз, потерпите неудачу,успех!
Это тоже опыт обучения многих мастеров. Но не бойтесь задавать вопросы, мы не будем кусать людей (по крайней мере, не кусать слишком сильно). Для накопления обучения всегда требуется время, а мастера не практикуются за один день.
d. Отступ
Отступы очень важны! Ваш код может нормально работать и без них, но чтение кода без отступов становится очень болезненным занятием. Может быть, небольшой фрагмент кода (менее 25 строк) не нужно делать с отступом или нет Это слишком важно, но как только код увеличивается, отступы очень необходимы.Поэтому научитесь использовать отступ как можно быстрее.Нет фиксированного стиля для отступов, но лучше сохранить стиль.
«Что такое отступ?«Вы можете спросить? Проще говоря, сохраняйте расстояние между кодом и границей страницы, чтобы можно было различить, к какому фрагменту кода принадлежит этот фрагмент кода. Некоторые люди привыкли использовать 3, 4 пробела или 1 табуляцию для обозначения отступ. Используйте один отступ для одного уровня.
Об отступах в ВикипедииСтиль отступаНа странице есть много примеров стилей. Рекомендуется выбрать стиль, который вам нравится или который, по вашему мнению, является наиболее легким для чтения.
Клавиатура
Примечание: названия буквенных и цифровых клавиш точно такие же, как и сами символы этих клавиш. То есть, клавиша «b» записывается как b, а клавиша «5» как 5.
Enter (или Return)
Backspace (или BS)
Следующие названия клавиш используются, когда Numlock выключен:
Эти названия клавиш используются при включенном Numlock’e:
Control (или Ctrl)
Клавиши расширенных функций Мультимедийных и Интернет-клавиатур:
Возможна запись VKnn, где nn является шестнадцатиричным виртуальным кодом клавиши. Несмотря на то, что этот редко используемый метод поддерживается всеми версиями программы, только с версии 1.0.38.02 и выше для некоторых типов горячих клавиш реализовано предотвращение отслеживания их функцией «keyboard hook» (обработчик клавиатурных прерываний). Например, следующая комбинация клавиш не использует обработчик клавиатурных прерываний (keyboard hook), и как следствие может быть запущена нажатием как клавиши Home, так и NumpadHome:
Джойстик
Несмотря на то, что следующие управляющие элементы джойстика не могут использоваться как горячие клавиши, их можно использовать при помощи команды GetKeyState:
JoyR: руль джойстика или 4-ая ось джойстика.
JoyU и JoyV: 5-ая и 6-ая оси джойстика.
JoyPOV: the point-of-view (hat) control (POV control, «шляпка» или «переключатель видов»; например, вид глазами игрока).
JoyName: название джойстика.
JoyButtons: количество кнопок, поддерживаемых джойстиком (не всегда точное).
JoyAxes: количество направлений, поддерживаемых джойстиком.
JoyInfo: генерирует строку, состоящую из нуля или более знаков, иллюстрирующих возможности джойстика: Z (имеется Z направление), R (имеется R направление), U (имеется U направление), V (имеется V направление), P (имеется POV control), D (POV control имеет ограниченное количество дискретных/промежуточных настроек), C (POV control передает непрерывные/точные данные). Пример строки: ZRUVPD.
Несколько джойстиков: если вы используете несколько джойстиков одновременно, то для более точной адресации команды используйте при записи номер джойстика перед именем клавиши джойстика. Например запись 2joy1 будет обозначать первую кнопку второго джойстика.
Примечание: если у вас возникли проблемы с определением скриптами вашего джойстика, вы можете попробовать изменить номер джойстика с 1 на что-нибудь другое, даже несмотря на то, что к компьютеру у вас подключен всего один. Неизвестно, по каким мистическим причинам, но иногда это вместе с использованием нашего тестового скрипта даёт положительный результат.
Использование джойстика как мыши: специальный скрипт превращает ваш джойстик в мышь (см. ссылку в оригинале статьи).
Дистанционные пульты управления
Специальные клавиши
Если ваши клавиатура или мышь имеют клавиши, не перечисленные выше, вы всё равно имеете возможность использовать их в качестве горячих клавиш, используя следующий метод:
Посылает нажатия клавиш и щелчки мыши в активное окно.
Параметры
Keys | Последовательность посылаемых клавиш. Как и в других командах, запятая перед первым параметром необязательна. |
Режим Raw (как есть): Команда SendRaw посылает клавиши в точности как они указаны, т.е. не преобразует
Нормальный режим: В этом режиме нижеследующие символы интерпретируются как модификаторы (они модифицируют только идущую непосредственно за ними клавишу).
#: Посылает нажатие Win, т.е. Send #e нажмёт клавишу Windows и, удерживая её, нажмёт клавишу «e».
SendInput и SendPlay [с версии 1.0.43]: SendInput и SendPlay используют тот же синтаксис, что и Send, но работают, как правило, быстрее и более надёжно. Кроме того они буферизуют физические нажатия на клавиши и кнопки мыши, которые происходят во время посылки, что не позволяет нажатиям пользователя смешиваться с теми, которые посылает скрипт. С помощью команды SendMode можно сделать команду Send синонимом SendInput или SendPlay. Более детальное описание каждого из режимов смотрите в разделах SendInput и SendPlay ниже.
SendEvent [с версии 1.0.43]: SendEvent использует для посылки тот же метод, что и команда Send в версиях до 1.0.43. Скорость посылки нажатий задаётся командой SetKeyDelay. По умолчанию, Send является синонимом SendEvent, но может быть сделана синонимом SendPlay или SendInput с помощью команды SendMode.
Имена клавиш. В списке ниже перечислены имена специальных клавиш, которые можно посылать (каждое имя должно заключаться в фигурные скобки).
Имя клавиши | Результирующее нажатие |
---|---|
Функциональные клавиши. Например, | |
! | |
# | |
+ | |
^ | |
< | |
<>> | > |
ENTER на основной клавиатуре | |
ESCAPE | |
Пробел (такое обозначение нужно только для пробелов в начале или конце строки, пробелы в середине могут быть обычными) | |
TAB | |
Backspace | |
Delete | |
Insert | |
Стрелка вверх на основной клавиатуре | |
Стрелка вниз на основной клавиатуре | |
Стрелка влево на основной клавиатуре | |
Стрелка вправо на основной клавиатуре | |
Home на основной клавиатуре | |
End на основной клавиатуре | |
Page Up на основной клавиатуре | |
Page Down на основной клавиатуре | |
CapsLock (использование команды SetCapsLockState более надёжно в NT/2k/XP) | |
ScrollLock (см. также SetScrollLockState) | |
NumLock (см. также SetNumLockState) | |
CONTROL (посылается код нейтральной виртуальной клавиши и левый сканкод) | |
Левый CONTROL (то же, что CONTROL в Win9x, но в NT/2k/XP будет послан код левой виртуальной клавиши) | |
Правый CONTROL | |
Нажимает и удерживает CONTROL пока не будет послан | |
ALT (посылается код нейтральной виртуальной клавиши и левый сканкод) | |
Левый ALT (то же, что ALT в Win9x, но в NT/2k/XP посылается код левой виртуальной клавиши) | |
Правый ALT (или AltGr, в зависимости от раскладки клавиатуры) | |
Нажимает и удерживает ALT пока не будет послан | |
SHIFT (посылает код нейтральной виртуальной клавиши и левый сканкод) | |
Левый SHIFT (то же, что SHIFT в Win9x, но в NT/2k/XP посылается код левой виртуальной клавиши) | |
Правый SHIFT | |
Нажимает и удерживает SHIFT пока не будет послан | |
Левая клавиша Windows | |
Правая клавиша Windows | |
Нажимает и удерживает левую клавишу Windows пока не будет послан | |
Нажимает и удерживает правую клавишу Windows пока не будет послан | |
Клавиша контекстного меню | |
Клавиша SLEEP | |
Посылает комбинацию Alt с кодом символа (набираемого на цифровой клавиатуре), которая может быть использована для генерации символов, которые не существуют на клавиатуре. Чтобы сгенерировать символы ASCII, используйте коды от 1 до 255. Для символов ANSI (стандарт для большинства языков) используйте коды от 128 до 255, но добавьте в начало 0, например Для символов Unicode указывайте коды от 256 до 65535 (без нуля в начале). Однако это поддерживается не всеми приложениями. Поэтому для большей совместимости и упрощения посылки длинных строк в Unicode используйте команду Transform Unicode. | |
Посылает нажатие, которое имеет код виртуальной клавиши XX и сканкод YYY. Например: Send | Режим Blind внутренне используется при переназначении клавиш. Например, переназначение a::b будет выдавать: 1) «b», когда вы нажмёте «a»; 2) «B» при нажатии «A» (в верхнем регистре); 3) Control-B при нажатии Control-A. |
[с версии 1.0.43] | Посылает строку буквально как она есть, т.е. не преобразует |
Повтор или удержание клавиши
Чтобы повторить нажатие несколько раз, заключите в фигурные скобки имя клавиши и число повторов. Например:
Чтобы удерживать нажатой или отпустить клавишу, поместите в фигурные скобки её имя и слово Down (вниз) или Up (вверх). Например:
Когда клавиша удерживается вышеописанным методом, не происходит её автоповтор, как это было бы при физическом удержании (причина в том, что автоповтор является возможностью драйвера/оборудования). Однако для симуляции автоповтора можно использовать Loop. Следующий пример посылает 20 нажатий Tab:
Вместо Down также можно использовать DownTemp. Эффект будет тот же, за исключением клавиш-модификаторов (Control/Shift/Alt/Win). В последнем случае DownTemp сообщает следующим за ним посылающим командам, что модификаторы не являются постоянно нажатыми, т.е. они могут отпускаться, если это нужно. Например, если за командой Send
Общие замечания
В добавок к буквам от A до Z, также поддерживаются следующие буквы и символы (однако, если кодовая страница вашей системы отлична от 1252 [США и Западная Европа], этот список может быть иным):
BlockInput в сравнении с SendInput/SendPlay: Хотя команда BlockInput может быть использована для защиты симулируемых скриптом нажатий от прерывания физическими нажатиями, производимыми пользователем, для этой цели часто лучше использовать SendInput или SendPlay. Их преимущество в том, что они не отбрасывают то, что печатает пользователь во время посылки; его нажатия запоминаются и посылаются позже.
Если нужно послать большое количество нажатий, их можно поместить в секцию продолжения, чтобы улучшить читабельность скрипта.
Поскольку операционная система не позволяет симуляцию комбинации CTRL-ALT-DELETE, команды вроде ^!
SendInput [с версии 1.0.43]
SendInput, как правило, является предпочтительным способом посылки нажатий благодаря его высокой скорости и надёжности. В большинстве случаев SendInput работает почти мгновенно даже при посылке длинных строк. Благодаря своей скорости он более надёжен, поскольку при этом снижается вероятность того, что какое-то другое окно выскочит неожиданно на первый план и перехватит посылаемые нажатия. Надёжность повышает и тот факт, что все физические нажатия пользователя во время посылки запоминаются и посылаются позже.
Если какой-то другой скрипт (не тот, где выполняется SendInput) установил низкоуровневый хук клавиатуры, SendInput автоматически переключается в SendEvent (или в SendPlay, если действует команда SendMode InputThenPlay). Это делается потому, что присутствие внешнего хука сводит на нет все преимущества SendInput, делая его хуже как SendPlay, так и SendEvent. Однако поскольку SendInput не способен обнаруживать низкоуровневые хуки, установленные другими программами, а только AutoHotkey с версии 1.0.43, в этих случаях он не будет переключаться, что сделает его менее надёжным, чем SendPlay/Event.
Когда SendInput посылает щелчки мыши способами вроде
SendPlay [с версии 1.0.43]
Наибольшее преимущество SendPlay заключается в его способности взаимодействовать с более широким спектром игр. Например, какая-либо игра может принимать строки автозамены, только если они имеют опцию SendPlay.
Из трёх режимов посылки, SendPlay самый необычный, так как он не симулирует нажатия и щелчки как таковые. Вместо этого он создаёт последовательность событий (сообщений), которые идут напрямую активному окну (наподобие ControlSend, но на более низком уровне).
Как и у SendInput, нажатия SendPlay не смешиваются с теми, что производит пользователь. Нажатия пользователя запоминаются и посылаются позже.
SendPlay неспособен вызывать срабатывание системных горячих клавиш, использующих клавиши Windows (LWin и RWin). Например, он не может вызвать Главное меню или открыть диалог «Выполнить» через Win-R.
Клавиши Windows (LWin и RWin) автоматически блокируются во время SendPlay, если установлен хук клавиатуры. Это предотвращает появление Главного меню, если пользователь случайно нажмёт клавишу Windows во время посылки. Другие клавиши не нуждаются в такой блокировке, поскольку операционная система буферизует их нажатия до момента окончания SendPlay.
SendPlay не использует стандартные настройки SetKeyDelay и SetMouseDelay. По умолчанию, задержки у него отсутствуют вообще. Как их можно изменить, показано в примерах ниже:
SendPlay не может включать и выключать CapsLock, NumLock и ScrollLock. Также он не может изменить состояние клавиш, которое считывается через GetKeyState, разве только нажатия посылаются в какое-либо из окон самого скрипта. Даже в этом случае изменения состояний левых и правых клавиш-модификаторов (например, RControl) могут быть считаны только через их нейтральный вариант (например, Control). SendPlay также имеет и другие ограничения, о которых рассказано в описании команды SendMode.
В отличие от SendInput и SendEvent, пользователь может прервать работу SendPlay, нажав Control-Alt-Del или Control-Escape. Когда такое происходит, оставшиеся нажатия не посылаются, но скрипт продолжает выполняться, как если бы SendPlay завершился нормально.
Хотя SendPlay может посылать события LWin и RWin, но они посылаются в активное окно и не выполняют своей обычной функции в операционной системе. Чтобы обойти это, используйте SendEvent. Например, команда SendEvent #r вызовет диалог «Выполнить».
Что такое AHK и для чего его используют? Как скачать и установить этот язык программирования?
В эру компьютеров, ежедневно выходят множество новых языков программирования. Некоторые из них — больши и всеобъемлющи, т.к. созданы для программирования целых программ, игр, или операционных систем, а некоторые — маленькие и простые, обычно используются для небольших, узкоспециализированных задач. В этой статье мы рассмотрим один из таких «простых» языков.
Что это такое и для чего используют?
Итак, AHK, или autohotkey — это язык программирования, выпущенный в 2003-ем году для операционной системы Microsoft windows, и несмотря на довольно «почтенный» возраст, он не перестает быть актуальным и поныне благодаря сообществу, что часто обновляет AHK.
Этот язык представляет собой настоящий инструмент для «подгонки» Windows OC под себя. С его помощью можно записывать простенькие скрипты (алгоритмы), которые система будет выполнять.
Основные функции
Скрипты AHK могут быть использованы для запуска программ, открытия документов, эмуляции, запись нажатий пользователем клавиш клавиатуры, нажатия мыши, и ее движений. Помимо этого, AutoHotkey могут назначать, менять переменные в Windows OC, управлять файлами и папками.
Так же, можно назначить выполнение любых скриптов нажатием любой клавиши, или их сочетания. Например, можно сделать так, чтобы нажатие ctrl+alt+i вынуждало открыться браузер, или открывало плеер и проигрывало некую мелодию.
Так же, АНК позволяет особым образом использовать аббревиатуры для написания текстов на русском или другом языке на компьютере. Например, в любой момент, когда пользователь пишет «кст» — система будет автоматически исправлять эти буквы в слово «кстати».
Так же, большинство скриптов могут запускаться одновременно с системой, для того, чтобы не было нужды запускать их специфичным нажатием клавиш, или открытием.
Инструкция по установке
Как уже сообщалось выше, АНК — это свободно распространяемый, бесплатный язык. Поэтому, нет абсолютно никакой нужды в том, чтобы искать и устанавливать его где-либо, кроме официального сайта.
Для этого, нам понадобиться любой браузер. Чтобы скачать AHK, вам потребуется провести такие действия:
Предлагаем посмотреть видео о том, как установить АНК:
AutoHotKey по сей день остается мощным инструментом персонализирования и настройки компьютера для своих нужд. Он позволяет легко и бесплатно заменить многие автоматические и муторные действия простым сочетанием клавиш, облегчая жизнь простому пользователю, настроить пользовательский интерфейс по своему усмотрению, и помимо этого предоставляет множество других полезных функций.