Using the program

Custom Combinations

You can define a custom combination of two keys (except joystick buttons) by using » & » between them. In the below example, you would hold down Numpad0 then press the second key to trigger the hotkey:

Numpad0 & Numpad1::MsgBox You pressed Numpad1 while holding down Numpad0.
Numpad0 & Numpad2::Run Notepad

The prefix key loses its native function: In the above example, Numpad0 becomes a prefix key; but this also causes Numpad0 to lose its original/native function when it is pressed by itself. To avoid this, a script may configure Numpad0 to perform a new action such as one of the following:

Numpad0::WinMaximize A   ; Maximize the active/foreground window.
Numpad0::Send {Numpad0}  ; Make the release of Numpad0 produce a Numpad0 keystroke. See comment below.

Fire on release: The presence of one of the above custom combination hotkeys causes the release of Numpad0 to perform the indicated action, but only if you did not press any other keys while Numpad0 was being held down. : This behaviour can be avoided by applying the to either hotkey.

Modifiers: Unlike a normal hotkey, custom combinations act as though they have the modifier by default. For example, will activate even if Ctrl or Alt is held down when 1 and 2 are pressed, whereas would be activated only by Ctrl+1 and not Ctrl+Alt+1.

For standard modifier keys, normal hotkeys typically work as well or better than «custom» combinations. For example, is recommended over .

Combinations of three or more keys are not supported. Combinations which your keyboard hardware supports can usually be detected by using #If and , but the results may be inconsistent. For example:

; Press AppsKey and Alt in any order, then slash (/).
#if GetKeyState("AppsKey", "P")
Alt & /::MsgBox Hotkey activated.

; If the keys are swapped, Alt must be pressed first (use one at a time):
#if GetKeyState("Alt", "P")
AppsKey & /::MsgBox Hotkey activated.

;  & \::
#if GetKeyState("")
\::MsgBox

Keyboard hook: Custom combinations involving keyboard keys always use the keyboard hook, as do any hotkeys which use the prefix key as a suffix. For example, causes to always use the hook.

4 — Running Programs & Websites

mspaint.exe, calc.exe, script.ahkRunhttps://www.autohotkey.com/

; Run a program. Note that most programs will require a FULL file path:
Run, %A_ProgramFiles%\Some_Program\Program.exe

; Run a website:
Run, https://www.autohotkey.com

There are some other advanced features as well, such as command line parameters and CLSID. If you want to learn more about that stuff, visit the Run page.

Here are a few more samples:

; Several programs do not need a full path, such as Windows-standard programs:
Run, notepad.exe
Run, mspaint.exe

; Run the "My Documents" folder using a :
Run, %A_MyDocuments%

; Run some websites:
Run, https://www.autohotkey.com
Run, https://www.google.com

For more in-depth information and examples, check out the Run page.

SendInput [v1.0.43+]

SendInput is generally the preferred method to send keystrokes and mouse clicks because of its superior speed and reliability. Under most conditions, SendInput is nearly instantaneous, even when sending long strings. Since SendInput is so fast, it is also more reliable because there is less opportunity for some other window to pop up unexpectedly and intercept the keystrokes. Reliability is further improved by the fact that anything the user types during a SendInput is postponed until afterward.

Unlike the other sending modes, the operating system limits SendInput to about 5000 characters (this may vary depending on the operating system’s version and performance settings). Characters and events beyond this limit are not sent.

Note: SendInput ignores SetKeyDelay because the operating system does not support a delay in this mode. However, when SendInput reverts to under the conditions described below, it uses (unless SendEvent’s KeyDelay is , in which case is used). When SendInput reverts to , it uses SendPlay’s KeyDelay.

If a script other than the one executing SendInput has a low-level keyboard hook installed, SendInput automatically reverts to (or if is in effect). This is done because the presence of an external hook disables all of SendInput’s advantages, making it inferior to both SendPlay and SendEvent. However, since SendInput is unable to detect a low-level hook in programs other than , it will not revert in these cases, making it less reliable than SendPlay/Event.

When SendInput sends mouse clicks by means such as , and is in effect (the default), every click will be relative to the window that was active at the start of the send. Therefore, if SendInput intentionally activates another window (by means such as alt-tab), the coordinates of subsequent clicks within the same command will be wrong because they will still be relative to the old window rather than the new one.

Remapping the Keyboard and Mouse

The syntax for the built-in remapping feature is . For example, a script consisting only of the following line would make A behave like B:

a::b

The above example does not alter B itself. B would continue to send the «b» keystroke unless you remap it to something else as shown in the following example:

a::b
b::a

The examples above use lowercase, which is recommended for most purposes because it also remaps the corresponding uppercase letters (that is, it will send uppercase when CapsLock is «on» or Shift is held down). By contrast, specifying an uppercase letter on the right side forces uppercase. For example, the following line would produce an uppercase B when you type either «a» or «A» (as long as CapsLock is off):

a::B

However, a remapping opposite to the one above would not work as one might expect, as a remapping never «releases» the modifier keys which are used to trigger it. For example, is typically equivalent to and is equivalent to . This is because each remapping to allow the key or key combination to be combined with other modifiers.

Mouse Remapping

To remap the mouse instead of the keyboard, use the same approach. For example:

Example Description
Makes the middle button behave like Shift.
Makes the fourth mouse button behave like the left mouse button.
Makes the right Alt behave like the right mouse button.

Other Useful Remappings

Example Description
Makes CapsLock become Ctrl. To retain the ability to turn CapsLock on and off, add the remapping first. This toggles CapsLock on and off when you hold down Shift and press CapsLock. Because both remappings allow additional modifier keys to be held down, the more specific remapping must be placed first for it to work.
Makes the fifth mouse button (XButton2) produce a control-click.
Makes the right Alt become Menu (which is the key that opens the context menu).
Makes the right Ctrl become the right Win.
Makes both Ctrl behave like Alt. However, see .
Makes Ctrl+X produce Ctrl+C. It also makes Ctrl+Alt+X produce Ctrl+Alt+C, etc.
Disables the right Win by having it simply return.

You can try out any of these examples by copying them into a new text file such as «Remap.ahk», then launching the file.

See the Key List for a complete list of key and mouse button names.

Introduction and Simple Examples

Hotkeys are sometimes referred to as shortcut keys because of their ability to easily trigger an action (such as launching a program or keyboard macro). In the following example, the hotkey Win+N is configured to launch Notepad. The pound sign stands for Win, which is known as a modifier key:

#n::
Run Notepad
return

In the final line above, serves to finish the hotkey. However, if a hotkey needs to execute only a single line, that line can be listed to the right of the double-colon. In other words, the is implicit:

#n::Run Notepad

To use more than one modifier with a hotkey, list them consecutively (the order does not matter). The following example uses to indicate Ctrl+Alt+S:

^!s::
Send Sincerely,{enter}John Smith  ; This line sends keystrokes to the active (foremost) window.
return

Run a Script

With AutoHotkey installed, there are several ways to run a script:

  • Double-click a script file (or shortcut to a script file) in Explorer.
  • Call AutoHotkey.exe on the command line and pass the script’s filename as a .
  • After creating , launch AutoHotkey via the shortcut in the Start menu to run it.
  • If AutoHotkey is pinned to the taskbar or Start menu on Windows 7 or later, recent or pinned scripts can be launched via the program’s Jump List.

Most scripts have an effect only while they are running. Use the or the ExitApp command to exit a script. Scripts are also forced to exit when Windows shuts down. To configure a script to start automatically after the user logs in, the easiest way is to place a shortcut to the script file in the folder.

Scripts can also be ; that is, combined together with an AutoHotkey binary file to form a self-contained executable (.exe) file.

Script File Codepage [AHK_L 51+]

In order for non-ASCII characters to be read correctly from file, the encoding used when the file was saved (typically by the text editor) must match what AutoHotkey uses when it reads the file. If it does not match, characters will be decoded incorrectly. AutoHotkey uses the following rules to decide which encoding to use:

  • If the file begins with a UTF-8 or UTF-16 (LE) byte order mark, the appropriate codepage is used and the switch is ignored.
  • If the switch is passed on the command-line, codepage n is used. For a list of possible values, see Code Page Identifiers.

    Note: The «Default to UTF-8» option in the AutoHotkey installer adds to the command line for all scripts launched via the shell (Explorer).

  • In all other cases, the system default ANSI codepage is used.

Note that this applies only to script files loaded by AutoHotkey, not to file I/O within the script itself. FileEncoding controls the default encoding of files read or written by the script, while IniRead and IniWrite always deal in UTF-16 or ANSI.

As all text is converted (where necessary) to the , characters which are invalid or don’t exist in the native codepage are replaced with a placeholder: ANSI ‘?’ or Unicode ‘�’. In Unicode builds, this should only occur if there are encoding errors in the script file or the codepages used to save and load the file don’t match.

RegWrite may be used to set the default for scripts launched from Explorer (e.g. by double-clicking a file):

; Uncomment the appropriate line below or leave them all commented to
;   reset to the default of the current build.  Modify as necessary:
; codepage := 0        ; System default ANSI codepage
; codepage := 65001    ; UTF-8
; codepage := 1200     ; UTF-16
; codepage := 1252     ; ANSI Latin 1; Western European (Windows)
if (codepage != "")
    codepage := " /CP" . codepage
cmd="%A_AhkPath%"%codepage% "`%1" `%*
key=AutoHotkeyScript\Shell\Open\Command
if A_IsAdmin    ; Set for all users.
    RegWrite, REG_SZ, HKCR, %key%,, %cmd%
else            ; Set for current user only.
    RegWrite, REG_SZ, HKCU, Software\Classes\%key%,, %cmd%

This assumes AutoHotkey has already been installed. Results may be less than ideal if it has not.

Returning Values to Caller

As described in , a function may optionally return a value to its caller.

Test := returnTest()
MsgBox % Test

returnTest() {
    return 123
}

If you want to return extra results from a function, you may also use :

returnByRef(A,B,C)
MsgBox % A "," B "," C

returnByRef(ByRef val1, ByRef val2, ByRef val3)
{
    val1 := "A"
    val2 := 100
    val3 := 1.1
    return
}

: and can be used to return multiple values or even named values:

Test1 := returnArray1()
MsgBox % Test1 "," Test1

Test2 := returnArray2()
MsgBox % Test2 "," Test2

Test3 := returnObject()
MsgBox % Test3.id "," Test3.val

returnArray1() {
    Test := 
    return Test
}

returnArray2() {
    x := 456
    y := "EFG"
    return 
}

returnObject() {
    Test := {id: 789, val: "HIJ"}
    return Test
}

Main Window

The script’s main window is usually hidden, but can be shown via the or one of the commands listed below to gain access to information useful for debugging the script. Items under the View menu control what the main window displays:

  • Lines most recently executed — See ListLines.
  • Variables and their contents — See ListVars.
  • Hotkeys and their methods — See ListHotkeys.
  • Key history and script info — See KeyHistory.

Known issue: Keyboard shortcuts for menu items do not work while the script is displaying a message box or other dialog.

The built-in variable contains the unique ID (HWND) of the script’s main window.

The title of this window is used by the #SingleInstance and Reload mechanisms to identify other instances of the same script. Changing the title prevents the script from being identified as such. The default title is equivalent to the expression .

Closing this window with WinClose (even from another script) causes the script to exit, but most other methods just hide the window and leave the script running.

Minimizing the main window causes it to automatically be hidden. This is done to prevent any owned windows (such as GUI windows or certain dialog windows) from automatically being minimized, but also has the effect of hiding the main window’s taskbar button. To instead allow the main window to be minimized normally, override the default handling with OnMessage. For example:

; This prevents the main window from hiding on minimize:
OnMessage(0x0112, Func("PreventAutoMinimize")) ; WM_SYSCOMMAND = 0x0112
OnMessage(0x0005, Func("PreventAutoMinimize")) ; WM_SIZE = 0x0005
; This prevents owned GUI windows (but not dialogs) from automatically minimizing:
OnMessage(0x0018, Func("PreventAutoMinimize"))

PreventAutoMinimize(wParam, lParam, uMsg, hwnd) {
    if (uMsg = 0x0112 && wParam = 0xF020 && hwnd = A_ScriptHwnd) { ; SC_MINIMIZE = 0xF020
        WinMinimize
        return 0 ; Prevent main window from hiding.
    }
    if (uMsg = 0x0005 && wParam = 1 && hwnd = A_ScriptHwnd) ; SIZE_MINIMIZED = 1
        return 0 ; Prevent main window from hiding.
    if (uMsg = 0x0018 && lParam = 1) ; SW_PARENTCLOSING = 1
        return 0 ; Prevent owned window from minimizing.
}

Написание собственных сценариев

В прошлом мы уже много рассказывали об AutoHotkey, в том числе о том, как улучшить Windows с помощью специальных скриптов AHK.

— поэтому я буду кратко о его использовании здесь. Если вы только начинаете работать с AHK, вы, вероятно, больше всего выиграете от расширения текста

,

По сути, расширение текста позволяет вам набрать немного текста, который автоматически расширяется. У вас есть повторяющиеся письма

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

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

Все довольно просто: введите две двоеточия, а затем текст горячей клавиши. После еще двух двоеточий введите фразу для расширения. Итак, если вы хотите, чтобы при наборе «@@» автоматически расширялся ваш адрес электронной почты, сценарий был бы:

Возможностей здесь много — вы можете сделать горячую клавишу CTRL + ALT + C выплевывать консервированные сообщения электронной почты, которые вы вводите несколько раз в день, или любое количество других задач, имеющих отношение к вашей работе:

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

Хотите, чтобы кнопка «Вставка» была ярлыком для «Копировать»? Вы можете сделать это!

Проверьте учебники AutoHotkey для получения дополнительной информации.

О языке

Возможности языка включают:

  • Совместимость с Windows XP / / Vista / / / 2008 R2 / / 8.1 / 2012 /
  • Версия для 64-битных систем.
  • Поддержка Юникода.
  • Запуск консольных приложений и доступ к стандартным потокам ввода-вывода.
  • Запуск программ от имени другого пользователя.
  • Компиляция скрипта в EXE файл.
  • Включение файлов в скомпилированный файл, которые можно извлекать при запуске.
  • Сжатие и защита исполняемого файла от декомпиляции.
  • Создание графических интерфейсов GUI, информационных сообщений, форм ввода информации.
  • Вызов функций из динамических библиотек и функций Windows API.
  • Работа с реестром Windows, буфером обмена, файлами (чтение, изменение, копирование, удаление).
  • Работа с объектами COM (Сomponent object modelling).
  • Перехват и эмуляция клавиатурных нажатий и кликов мышки.
  • Работа с окнами (особенно легко работать с графическими элементами из Windows): передвижение, скрытие, отображение, изменение размера, активизация, закрытие. К окнам можно обращаться по их заголовку, отображаемому тексту, размеру, расположению, классу, по внутренним дескрипторам (handle) Win32 API, определяемым с помощью входящей в комплект поставки утилиты WindowSpy.
  • Получение информации и взаимодействие с элементами управления (особенно стандартными): поле редактирования, переключатель, список, кнопки, статусная строка и т. д., в том числе неактивными.
  • Интернет: чтение HTML кода страниц и скачивание файлов, работа с FTP, отправка E-mail сообщений, работа с базами данных MySQL и SQLite.
  • Работа с протоколами TCP и UDP.
  • Автоматизация работы в браузерах: Internet Explorer, Opera, Firefox, Google Chrome.
  • Обычные элементы высокоуровневого языка, такие как работа с циклами, функциями и переменными.
  • Огромное количество функций для работы с текстом (как со строками и массивами данных, так и с отдельными символами), в том числе с регулярными выражениями в стиле Perl (используется библиотека PCRE).
  • Работа со звуком и музыкой.
  • Работа со сложными математическими, геометрическими и физическими расчётами (например, с тригонометрическими функциями).
  • Простой синтаксис.
  • AutoHotkey_H — объединённая версия в виде COM и DLL, позволяющая использовать возможности AHK в программах, написанных на других языках.
  • Оптимизация и автоматизация монотонных действий (удаление, перемещение временных файлов, очистка кэш-данных, скачивание файлов).

Интерпретатор AutoHotkey имеет небольшой размер и не требует обязательной установки. Для работы достаточно основного файла, а для создания скрипта — любого текстового редактора. Для запуска без интерпретатора скрипт необходимо предварительно скомпилировать.

Для AutoHotkey существует интегрированная среда разработки под названием SciTE4AutoHotkey, основанный на бесплатном редакторе SciTE. Компилятор, вспомогательные утилиты и справочные материалы полностью интегрированы, что делает редактор стандартным окружением для разработчиков, использующих AHK. Компилятор AHK и среда разработки SciTE легко устанавливаются и в дополнительной настройке не нуждается.

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

Популярное использование AutoHotkey:

  • Разработка утилит для Microsoft Windows.
  • Мониторинг веб-сайтов, сетей.
  • Дефрагментация дисков и резервное копирование.
  • Переназначение клавиш, глобально или у отдельных программ
  • Управление мышкой с помощью клавиатуры или джойстика
  • Слежение за системой, автоматическое выполнение некоторых действий по желанию пользователя.
  • Создание ботов/читов/помощников/биндерам к играм. Боты позволяют автоматизировать некоторые действия в играх, в результате пользователь может быстрее добиться нужного результата.

Для упрощения разработки графических интерфейсов существует визуальный редактор SmartGUI Creator.

Исходный код AutoHotkey всех версий на языке С++ доступен для загрузки на GitHub.

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

Имитируем клики мышкой

С кликами мышкой работать несколько сложнее, чем с использованием клавиатуры, так как здесь помимо кнопок есть еще и определенное месторасположение курсора, которое нужно указывать. В связи с этим пользователь сначала должен определить координаты 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». В этой команде уже нужно будет вводить сразу пять параметров, первый из которых представляет собой клик нужной кнопкой мыши, второй и третий включают в себя стартовые координаты, а четвертый и пятый – последние, то есть то место, где мышка должна быть отпущена.

Команда может выглядеть примерно следующим образом:

Таким образом, вы можете экспериментировать с самыми разнообразными командами, и доводить автоматизм различных процедур до самых невероятных вершин.

Repeating or Holding Down a Key

To repeat a keystroke: Enclose in braces the name of the key followed by the number of times to repeat it. For example:

Send {DEL 4}  ; Presses the Delete key 4 times.
Send {S 30}   ; Sends 30 uppercase S characters.
Send +{TAB 4}  ; Presses Shift-Tab 4 times.

To hold down or release a key: Enclose in braces the name of the key followed by the word Down or Up. For example:

Send {b down}{b up}
Send {TAB down}{TAB up}
Send {Up down}  ; Press down the up-arrow key.
Sleep 1000  ; Keep it down for one second.
Send {Up up}  ; Release the up-arrow key.

When a key is held down via the method above, it does not begin auto-repeating like it would if you were physically holding it down (this is because auto-repeat is a driver/hardware feature). However, a Loop can be used to simulate auto-repeat. The following example sends 20 tab keystrokes:

Loop 20
{
    Send {Tab down}  ; Auto-repeat consists of consecutive down-events (with no up-events).
    Sleep 30  ; The number of milliseconds between keystrokes (or use SetKeyDelay).
}
Send {Tab up}  ; Release the key.

By default, Send will not automatically release a modifier key (Control, Shift, Alt, and Win) if that modifier key was «pressed down» by sending it. For example, may behave similar to if the user is physically holding Ctrl, but followed by will produce Ctrl+A. DownTemp and DownR can be used to override this behavior. DownTemp and DownR have the same effect as Down except for the modifier keys (Control, Shift, Alt, and Win).

DownTemp tells subsequent sends that the key is not permanently down, and may be released whenever a keystroke calls for it. For example, followed later by would produce A, not Ctrl+A. Any use of Send may potentially release the modifier permanently, so DownTemp is not ideal for remapping modifier keys.

: DownR (where «R» stands for remapping, which is its main use) tells subsequent sends that if the key is automatically released, it should be pressed down again when send is finished. For example, followed later by would produce A, not Ctrl+A, but will leave Ctrl in the pressed state for use with keyboard shortcuts. In other words, DownR has an effect similar to physically pressing the key.

If a character does not correspond to a virtual key on the current keyboard layout, it cannot be «pressed» or «released». For example, has no effect on most layouts, and is equivalent to .

Dynamically Calling a Function

: A function (even a ) may be called dynamically via percent signs. For example, would call the function whose name is contained in Var. Similarly, would call Func1() or Func2(), etc., depending on the current value of A_Index.

: Var in can contain a function name or a function object. If the function does not exist, the ‘s __Call meta-function is invoked instead.

If the function cannot be called due to one of the reasons below, the evaluation of the expression containing the call stops silently and prematurely, which may lead to inconsistent results:

  • Calling a nonexistent function, which can be avoided by using . Except for , the called function’s must exist explicitly in the script by means such as #Include or a non-dynamic call to a .
  • Passing too few parameters, which can be avoided by checking ‘s return value (which is the number of mandatory parameters plus one). : Note that passing too many parameters is tolerated; each extra parameter is fully evaluated (including any calls to functions) and then discarded.

Finally, a dynamic call to a function is slightly slower than a normal call because normal calls are resolved (looked up) before the script begins running.

Hotkey Tips and Remarks

Each numpad key can be made to launch two different hotkey subroutines depending on the state of NumLock. Alternatively, a numpad key can be made to launch the same subroutine regardless of the state. For example:

NumpadEnd::
Numpad1::
MsgBox, This hotkey is launched regardless of whether NumLock is on.
return

If the is used with a even once, it changes the behavior of that prefix key for all combinations. For example, in both of the below hotkeys, the active window will receive all right-clicks even though only one of the definitions contains a tilde:

~RButton & LButton::MsgBox You pressed the left mouse button while holding down the right.
RButton & WheelUp::MsgBox You turned the mouse wheel up while holding down the right button.

The Suspend command can temporarily disable all hotkeys except for ones you make exempt. For greater selectivity, use #IfWinActive/Exist.

By means of the Hotkey command, hotkeys can be created dynamically while the script is running. The Hotkey command can also modify, disable, or enable the script’s existing hotkeys individually.

Joystick hotkeys do not currently support modifier prefixes such as ^ (Ctrl) and # (Win). However, you can use to mimic this effect as shown in the following example:

Joy2::
if not GetKeyState("Control")  ; Neither the left nor right Control key is down.
    return  ; i.e. Do nothing.
MsgBox You pressed the first joystick's second button while holding down the Control key.
return

There may be times when a hotkey should wait for its own modifier keys to be released before continuing. Consider the following example:

^!s::Send {Delete}

Pressing Ctrl+Alt+S would cause the system to behave as though you pressed Ctrl+Alt+Del (due to the system’s aggressive detection of this hotkey). To work around this, use KeyWait to wait for the keys to be released; for example:

^!s::
KeyWait Control
KeyWait Alt
Send {Delete}
return

If a hotkey label like produces an error like «Invalid Hotkey», your system’s keyboard layout/language might not have the specified character («Z» in this case). Try using a different character that you know exists in your keyboard layout.

A hotkey label can be used as the target of a Gosub or Goto. For example: .

One common use for hotkeys is to start and stop a repeating action, such as a series of keystrokes or mouse clicks. For an example of this, see .

Finally, each script is quasi multi-threaded, which allows a new hotkey to be launched even when a previous hotkey subroutine is still running. For example, new hotkeys can be launched even while a message box is being displayed by the current hotkey.

Short-circuit Boolean Evaluation

When AND, OR, and the are used within an , they short-circuit to enhance performance (regardless of whether any function calls are present). Short-circuiting operates by refusing to evaluate parts of an expression that cannot possibly affect its final result. To illustrate the concept, consider this example:

if (ColorName != "" AND not FindColor(ColorName))
    MsgBox %ColorName% could not be found.

In the example above, the FindColor() function never gets called if the ColorName variable is empty. This is because the left side of the AND would be false, and thus its right side would be incapable of making the final outcome true.

Because of this behavior, it’s important to realize that any side-effects produced by a function (such as altering a global variable’s contents) might never occur if that function is called on the right side of an AND or OR.

It should also be noted that short-circuit evaluation cascades into nested ANDs and ORs. For example, in the following expression, only the leftmost comparison occurs whenever ColorName is blank. This is because the left side would then be enough to determine the final answer with certainty:

if (ColorName = "" OR FindColor(ColorName, Region1) OR FindColor(ColorName, Region2))
    break   ; Nothing to search for, or a match was found.

As shown by the examples above, any expensive (time-consuming) functions should generally be called on the right side of an AND or OR to enhance performance. This technique can also be used to prevent a function from being called when one of its parameters would be passed a value it considers inappropriate, such as an empty string.

: The also short-circuits by not evaluating the losing branch.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector