Concepts and conventions
Содержание:
- AutoHotkey автоматизация процессов 1.1.33.00
- Установка AutoHotkey
- Function Hotstrings [v1.1.28+]
- Using Subroutines Within a Function
- COM Objects
- 6 — Variables
- Сила AutoHotkey
- Скрипты AutoHotKey для CS:GO
- Joystick
- Custom Combinations
- Returning Values to Caller
- Как пользоваться
- Language Syntax
- 5 — Commands vs. Functions()
AutoHotkey автоматизация процессов 1.1.33.00
AutoHotkey — бесплатная программа с открытым исходным кодом для создания макросов и автоматизации, позволяющая упростить повторяющиеся задачи. Она поддерживает собственный язык программирования сценариев (скриптов), приспособленный к лёгкому назначению и переназначению горячих клавиш.Системные требования:Windows XP/Vista/7/8/8.1/10Торрент AutoHotkey автоматизация процессов 1.1.33.00 подробно:Возможности программы:·Автоматизировать почти все процессы лишь нажатием клавиши или кликом мыши. Вы можете писать макросы вручную или с использованием макрорегистраторов.·Задавать «горячие» клавиши для клавиатуры, джойстика и мыши. Практически любая клавиша, кнопка или комбинация может стать «горячей» клавишей.·Использовать автозамену при печатании. Например, аббревиатура «btw» может автоматически заменяться на «by the way».·Создавать пользовательские формы ввода данных, пользовательские интерфейсы и меню. Чтобы получить дальнейшую информацию, см. раздел, посвященный GUI.·Переназначать клавиши и кнопки на клавиатуре, джойстике или мыши.·Передавать сигналы ручного пульта дистанционного управления через клиентский скрипт WinLIRC.·Пользоваться уже существующими скриптами AutoIt v2, а также добавлять в них новые возможности.·Конвертировать любой скрипт в EXE-файл, который затем можно запустить даже на компьютерах, где не установлен AutoHotkey.·Изменение громкости, приглушение звука (mute) и другие настройки любой звуковой карты.·Возможность делать окна прозрачными, устанавливать поверх других окон или изменять их форму.·Использование джойстика или клавиатуры в качестве мыши.·Мониторинг вашей системы. Например, возможность закрывать нежелательные окна при их появлении.·Чтение и изменение содержимого буфера обмена, включая имена файлов, скопированные из окна Explorer.·Запрет или замена собственных «быстрых» клавиш Windows, таких, как Win+E и Win+R.·Уменьшение травм от работы на клавиатуре путем замены комбинации Alt-Tab на другие клавиши, ролик или кнопки мыши.·Настройка меню трея собственными пиктограммами, всплывающими подсказками, пунктами меню и субменю.·Отображение диалоговых окон, подсказок и всплывающих меню, обеспечивающих взаимодействие с пользователем.·Выполнение заданных сценарием операций в ответ на завершение работы системы или конец сеанса.·Определение продолжительности простоя в работе пользователя. Например, запуск объемных задач CPU только в отсутствие пользователя.·Автоматизация игровых действий путем распознавания изображений и цветов пикселов.·Более простое, чем в других языках, чтение, запись и анализ текстовых файлов.·Выполнение операций с файлами с использованием подстановочных символов.·Работа с реестром и INI-файлами.Что нового:·Added #ErrorStdOut Encoding parameter.·Added /ErrorStdOut=Encoding command line switch.·Added #Warn Unreachable (warning mode).·Added #Requires AutoHotkey vVersion (directive).·Added detection of program-terminating SEH exceptions, to display an error dialog.·Fixed a possible bug where Input causes undefined behaviour. ·Fixed WinKill.·Fixed A_WinDir to always return the system Windows directory.·Fixed FileGetShortcut/FileCreateShortcut to return and accept negative icon indices without modification.·Fixed InputBox Locale option to not focus the Cancel button.·Fixed menu bar keyboard shortcuts not working when GUI has no controls.·Fixed LoadPicture to use 256×256 graphic when available in a DLL/EXE.·Fixed DBGp stderr copy mode to not suppress error dialogs.·Fixed ControlGet Line setting ErrorLevel=1 when line is just empty.Fixed Send causing unwanted hotkey buffering.
Скриншоты AutoHotkey автоматизация процессов 1.1.33.00 торрент:
Скачать AutoHotkey автоматизация процессов 1.1.33.00 через торрент:
autohotkey-1_1_33_00.torrent (cкачиваний: 54)
Установка AutoHotkey
Прежде чем вы сможете протестировать некоторые скрипты или создать свои собственные, вам нужно установить AutoHotkey. Посетите главную страницу AHK, нажмите Скачать на правой стороне, и выберите монтажник захватить самую простую версию для установки. Запустите диалог быстрой установки, и AutoHotkey будет запущен и готов к работе!
Теперь только что установленная программа обрабатывает выполнение сценариев, которые вы пишете на языке AutoHotkey, но у вас еще нет запущенных сценариев! Чтобы создать новый, убедитесь, что AutoHotkey запущен (откройте меню «Пуск» и введите AutoHotkey запустить программу), затем щелкните правой кнопкой мыши в любом месте на рабочем столе или в любом другом удобном месте и выберите New> AutoHotkey Script. Назовите это что-нибудь полезное и убедитесь, что файл заканчивается .АХК, или это не будет работать правильно.
Если вы собираетесь писать несколько сценариев для AutoHotkey, неплохо бы обновить ваш текстовый редактор из мягкого блокнота
, Notepad ++ — отличный бесплатный вариант, который рекомендуется для этой цели
Обратите внимание, что вы можете открыть свой текстовый редактор, ввести код и просто сохранить его как файл, оканчивающийся на .АХК и вы достигнете того же результата, что и вышеописанный метод
Теперь, когда у вас есть программное обеспечение для запуска сценариев, вы можете загрузить код, написанный другими, для автоматизации всех видов задач. Чтобы сохранить скрипт, просто загрузите его как .АХК файл и сохранить его, где вы хотите.
Возможно, вы захотите, чтобы некоторые из этих сценариев запускались сразу после загрузки компьютера, поэтому вам не нужно каждый раз запускать их вручную. Для этого скопируйте и вставьте .АХК файлы в папку «Автозагрузка», набрав оболочка: запуск в меню «Пуск» или перейдя по следующему адресу:
Это обеспечит их запуск сразу после запуска, поэтому вы не пытаетесь использовать комбинации клавиш и ничего не получаете!
Function Hotstrings [v1.1.28+]
One or more hotstrings can be assigned a function by simply defining it immediately after the hotstring label, as in this example:
; This example also demonstrates one way to implement case conformity in a script. :C:BTW:: ; Typed in all-caps. :C:Btw:: ; Typed with only the first letter upper-case. : :btw:: ; Typed in any other combination. case_conform_btw() { hs := A_ThisHotkey ; For convenience and in case we're interrupted. if (hs == ":C:BTW") Send BY THE WAY else if (hs == ":C:Btw") Send By the way else Send by the way }
For additional details, see .
The Hotstring function can also be used to assign a function or function object to a hotstring.
Using Subroutines Within a Function
Although a function cannot contain of other functions, it can contain subroutines. As with other subroutines, use Gosub to launch them and Return to return (in which case the Return would belong to the Gosub and not the function).
Known limitation: Currently, the name of each subroutine (label) must be unique among those of the entire script. The program will notify you upon launch if there are duplicate labels.
If a function uses Gosub to jump to a public subroutine (one that lies outside of the function’s braces), all variables outside are global and the function’s own are not accessible until the subroutine returns. However, A_ThisFunc will still contain the name of the function.
Although Goto cannot be used to jump from inside a function to outside, it is possible for a function to Gosub an external/public subroutine and then do a Goto from there.
Although the use of Goto is generally discouraged, it can be used inside a function to jump to another position within the same function. This can help simplify complex functions that have many points of return, all of which need to do some clean-up prior to returning.
A function may contain externally-called subroutines such as timers, , and menu items. This is generally done to encapsulate them in a separate file for use with #Include, which prevents them from interfering with the script’s . However, the following limitations apply:
- Such subroutines should use only and variables (not ) if their function is ever called normally. This is because a subroutine thread that interrupts a function-call thread (or vice versa) would be able to change the values of local variables seen by the interrupted thread. Furthermore, any time a function returns to its caller, all of its local variables are made blank to free their memory.
- Such subroutines should use only (not ) as .
- When a function is entered by a subroutine thread, any references to dynamic variables made by that thread are treated as (including commands that create arrays).
COM Objects
Since Key and Value are passed directly to the enumerator’s Next() method, the values they are assigned depends on what type of object is being enumerated. For COM objects, Key contains the value returned by IEnumVARIANT::Next() and Value contains a number which represents its variant type. For example, when used with a Scripting.Dictionary object, each Key contains a key from the dictionary and Value is typically 8 for strings and 3 for integers. See ComObjType() for a list of type codes.
: When enumerating a SafeArray, Key contains the current element and Value contains its variant type.
6 — Variables
Variables are like little post-it notes that hold some information. They can be used to store text, numbers, data from functions and commands or even mathematical equations. Without them, programming and scripting would be much more tedious.
Variables can be assigned a few ways. We’ll cover the most common forms. Please pay attention to the equal sign ().
- Legacy text assignment
-
MyVar = Text
This is the simplest form for a variable, a legacy assignment. Simply type in your text and done.
- Legacy variable assignment
-
MyVar = %MyVar2%
Same as above, but you are assigning a value of a variable to another variable.
- Legacy mixed assignment
-
MyVar = %MyVar2% some text %MyVar3%.
A combination of the two legacy assignments above.
- Expression text assignment
-
MyVar := "Text"
This is an expression assignment, due to the before the . Any text needs to be in quotes.
- Expression variable assignment
-
MyVar := MyVar2
In expression mode, variables do not need percent signs.
- Expression number assignment
-
MyVar := 6 + 8 / 3 * 2 - Sqrt(9)
Thanks to expressions, you can do math!
- Expression mixed assignment
-
MyVar := "The value of 5 + " MyVar2 " is: " 5 + MyVar2
A combination of the three expression assignments above.
Equal signs (=) with a symbol in front of it such as etc. are called assignment operators and always require an expression.
a. When to use percents
One of the most common issues with AutoHotkey involving variables is when to use the percent signs (%). Hopefully this will clear some confusion.
When to use percent signs:
- When you are using commands (see above), except when the parameter is OutputVar or InputVar.
- When you are assigning a value to a variable using the legacy mode (an equal sign with no symbol in front of it).
When not to use percent signs:
- In parameters that are input or output variables. For example:
- On the left side of an assignment:
- On the left side of legacy (non-expression) if-statements:
- Everywhere in expressions. For example:
if (Var1 != Var2) Var1 := Var2 + 100
b. Getting user input
Sometimes you want to have the user to choose the value of stuff. There are several ways of doing this, but the simplest way is InputBox. Here is a simple example on how to ask the user a couple of questions and doing some stuff with what was entered:
InputBox, OutputVar, Question 1, What is your first name? if (OutputVar = "Bill") MsgBox, That's an awesome name`, %OutputVar%. InputBox, OutputVar2, Question 2, Do you like AutoHotkey? if (OutputVar2 = "yes") MsgBox, Thank you for answering %OutputVar2%`, %OutputVar%! We will become great friends. else MsgBox, %OutputVar%`, That makes me sad.
c. Other Examples?
MsgBox, 4,, Would you like to continue? IfMsgBox, No return ; If No, stop the code from going further. MsgBox, You pressed YES. ; Otherwise, the user picked yes.
; Some examples showing when to use percents and when not: Var = Text ; Assign some text to a variable (legacy). Number := 6 ; Assign a number to a variable (expression). Var2 = %Var% ; Assign a variable to another (legacy). Var3 := Var ; Assign a variable to another (expression). Var4 .= Var ; Append a variable to the end of another (expression). Var5 += Number ; Add the value of a variable to another (expression). Var5 -= Number ; Subtract the value of a variable from another (expression). Var6 := SubStr(Var, 2, 2) ; Variable inside a function. This is always an expression. Var7 = %Var% Text ; Assigns a variable to another with some extra text (legacy). Var8 := Var " Text" ; Assigns a variable to another with some extra text (expression). MsgBox, %Var% ; Variable inside a command. StringSplit, Var, Var, x ; Variable inside a command that uses InputVar and OutputVar. if (Number = 6) ; Whenever an IF has parentheses, it'll be an expression. So no percent signs. if (Var != Number) ; Whenever an IF has parentheses, it'll be an expression. So no percent signs. if Number = 6 ; Without parentheses, the IF is legacy. However, only variables on the 'right side' need percent signs. if Var1 < %Var2% ; Without parentheses, the IF is legacy. However, only variables on the 'right side' need percent signs.
Сила AutoHotkey
Отличительной особенностью AutoHotkey является то, что он полностью настраивается для ваших нужд. Если вы просто хотите автозамену и несколько простых битов расширения текста, вы можете легко настроить это. Если вы хотите углубиться в множество пользовательских элементов управления и сложных сочетаний клавиш, вы можете написать все, что пожелаете.
У вас не должно возникнуть проблем с использованием AHK! Мы писали о том, как это может помочь вам более эффективно играть в Path of Exile
и, скорее всего, это может помочь с вашей любимой игрой. Не геймер? Объедините это с существующими ярлыками Microsoft Office
и вы будете более продуктивны, чем когда-либо прежде!
Какие ваши любимые варианты использования AutoHotkey? Поделитесь своими любимыми сценариями с нами ниже, чтобы расширить список!
Имидж Кредит: проведение стоматологического оборудования FabrikaSimf через Shutterstock
Скрипты AutoHotKey для CS:GO
Bhop
Bhop (распрыжка) — это крутой скрипт для отработки упражнений, когда вы освоите его, подумайте о распрыжке с колесом прокрутки.
F11 для включения и отключения. Кнопка End дял полного отключения.
VAC вас НИКОГДА не обнаружит.
Autofire
Autofire не очень практичен для конкурентного игрового процесса, но с DM и Casual это интересно.
Они безопасны для VAC, но их не рекомендуется использовать в конкурентных состязаниях или на пользовательских серверах, их обнаруживает пользовательский античит.
Чтобы поставить скрипт на паузу нажмите F6.
Ultimate CS:GO Multiscript
Это НЕ чит, он не будет вводить или делать что-либо с CS:GO, он просто симулирует события мыши/клавиатуры.
Характеристики
- Удивительный графический интерфейс для быстрого и простого отображения.
- Авто-купить оружие, можно настроить в графическом интерфейсе
- Burst, 1x Tap, 2x режима огня
- Rapid Fire (Autofire) для ваших пистолетов/ружей
- Вертикальный контроль отдачи (в сочетании с автопожаром для пистолета Norecoil)
- Bhop (распрыжка)
- Медленный авто огонь для Deagles
- Авто нож для лучших ножевых комбо!
Горячие кнопки
- На цифровом блоке клавиатуры 1-3: Выберите пресет для автоматической покупки
- На цифровом блоке клавиатуры 4: авто огонь
- На цифровом блоке клавиатуры 5: авто нож
- На цифровом блоке клавиатуры 6: одно нажатие = взрыв, удерживайте мышь для спрея с катушкой
- На цифровом блоке клавиатуры 7-9: 1x Tap, 2x Tap, Взрыв
- Правый Ctrl: режим огня по умолчанию
- Правый Alt: переключить «без отдачи»
- CapsLock: переключить Bhop (раскрыжка)
- Правый Shift: сделать norecoil (без отдачи) непротиворечивым (только для cz auto)
Пролистните до Code: и разверните Spoiler:
Скрипт длинный, поэтому убедитесь, что полностью скопировали его.
Joystick
Joy1 through Joy32: The buttons of the joystick. To help determine the button numbers for your joystick, use this . Note that hotkey prefix symbols such as ^ (control) and + (shift) are not supported (though can be used as a substitute). Also note that the pressing of joystick buttons always «passes through» to the active window if that window is designed to detect the pressing of joystick buttons.
Although the following Joystick control names cannot be used as hotkeys, they can be used with :
- JoyX, JoyY, and JoyZ: The X (horizontal), Y (vertical), and Z (altitude/depth) axes of the joystick.
- JoyR: The rudder or 4th axis of the joystick.
- JoyU and JoyV: The 5th and 6th axes of the joystick.
- JoyPOV: The point-of-view (hat) control.
- JoyName: The name of the joystick or its driver.
- JoyButtons: The number of buttons supported by the joystick (not always accurate).
- JoyAxes: The number of axes supported by the joystick.
- JoyInfo: Provides a string consisting of zero or more of the following letters to indicate the joystick’s capabilities: Z (has Z axis), R (has R axis), U (has U axis), V (has V axis), P (has POV control), D (the POV control has a limited number of discrete/distinct settings), C (the POV control is continuous/fine). Example string: ZRUVPD
Multiple Joysticks: If the computer has more than one joystick and you want to use one beyond the first, include the joystick number (max 16) in front of the control name. For example, 2joy1 is the second joystick’s first button.
Note: If you have trouble getting a script to recognize your joystick, one person reported needing to specify a joystick number other than 1 even though only a single joystick was present. It is unclear how this situation arises or whether it is normal, but experimenting with the joystick number in the can help determine if this applies to your system.
See Also:
- Joystick remapping: Methods of sending keystrokes and mouse clicks with a joystick.
- : Using a joystick as a mouse.
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.
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 }
Как пользоваться
Дальше давайте переходить к практике и разбираться, где бесплатно скачать последнюю версию данного предложения, как его установить, а также как написать свой первый скрипт при помощи AutoHotkey.
Загрузка и установка
Начинать мы будем именно с установки. Тем более, что как таковой, ее здесь нет. Данная программа работает сразу после запуска. Рассмотрим, как его осуществить:
- Сначала мы загружаем архив с приложением, прокрутив страничку ниже и воспользовавшись кнопкой для его скачивания. Распаковываем исполняемый файл и запускаем его двойным левым кликом.
- Теперь нам необходимо предоставить доступ к администраторским полномочиям. В противном случае приложение не сможет корректно работать.
- На этом все. Наша программа установленная и теперь можно переходить непосредственно к работе с ней.
Инструкция по работе
Теперь давайте в общих чертах разберемся, как пользоваться данным приложением. Первое, что следует знать, это скриптовый язык программирования, который тут используется. Без него ни одного макроса написать, к сожалению, не получится. А сам алгоритм использования программы выглядит следующим образом:
- Вы пишите макрос, которым должна руководствоваться в своей работе AutoHotkey.
- Далее при помощи программы открываем данный скрипт и, при необходимости, преобразуем его в EXE-файл.
- Дальше мы можем использовать файл где угодно.
Вот так выглядит сам скрипт, а также созданный с его помощью исполняемый файл.
Language Syntax
When are quotation marks used with commands and their parameters?
Double quotes («) have special meaning only within . In all other places, they are treated literally as if they were normal characters. However, when a script launches a program or document, the operating system usually requires quotes around any command-line parameter that contains spaces, such as in this example: .
When exactly are variable names enclosed in percent signs?
Variable names are always enclosed in percent signs except in cases illustrated in bold below:
- In parameters that are input or output variables:
- On the left side of an assignment:
- On the left side of traditional (non-expression) if-statements:
- Everywhere in . For example:
If (Var1 <> Var2) Var1 := Var2 + 100
For further explanation of how percent signs are used, see and . Percent signs can also have other meanings:
- The causes a command parameter to be interpreted as an expression.
- Escaped percent signs () and percent signs in have no special meaning (they are interpreted as literal percent signs).
When should percent signs and commas be escaped?
Literal percent signs must be escaped by preceding them with an accent/backtick. For example: Literal commas must also be escaped () except when used in MsgBox or the last parameter of any command (in which case the accent is permitted but not necessary).
When commas or percent signs are enclosed in quotes within an , the accent is permitted but not necessary. For example: .
5 — Commands vs. Functions()
AutoHotkey has two main types of things used by the scripter to create code: Commands and functions.
A list of all commands and built-in functions can be found here.
Commands
You can tell what a command is by looking at its syntax (the way it looks). Commands do not use parentheses around the parameters like functions do. So a command would look like this:
Command, Parameter1, Parameter2, Parameter3
When using commands, you cannot squish other commands onto the same line as a previous command (exception: IfEqual). You cannot put commands inside the parameters of other commands. For example:
MsgBox, Hello Run, notepad.exe ; Wrong MsgBox, Hello, Run, notepad.exe ; Wrong MsgBox, Hello ; Correct Run, notepad.exe
need
You can do math in parameters if you force an expression with a single , but that will not be covered.
Functions
As stated above, functions are different because they use parentheses. A typical function looks like:
Function(Parameter1, Parameter2, Parameter3)
Functions have a few main differences:
- You can do math in them:
SubStr(37 * 12, 1, 2) SubStr(A_Hour - 12, 2)
- Variables do not need to be wrapped in percent signs:
SubStr(A_Now, 7, 2)
- Functions can go inside of functions:
SubStr(A_AhkPath, InStr(A_AhkPath, "AutoHotkey"))
- Text needs to be wrapped in quotes:
SubStr("I'm scripting, awesome!", 16)
A function usually return a value differently than a command does. Commands need an OutputVar parameter, functions do not. The most common way assigning the value of a function to a variable is like so:
MyVar := SubStr("I'm scripting, awesome!", 16)
This isn’t the only way, but the most common. You are using to store the return value of the function that is to the right of the operator. See Functions for more details.
In short:
; These are commands: MsgBox, This is some text. StringReplace, Output, Input, AutoHotKey, AutoHotkey, All SendInput, This is awesome{!}{!}{!} ; These are functions: SubStr("I'm scripting, awesome!", 16) FileExist(VariableContainingPath) Output := SubStr("I'm scripting, awesome!", 16)
a. Code blocks
Code blocks are lines of code surrounded by little curly brackets ( and ). They group a section of code together so that AutoHotkey knows it’s one big family and that it needs to stay together. They are most often used with functions and control flow statements such as If and Loop. Without them, only the first line in the block is called.
In the following code, both lines are run only if MyVar equals 5:
if (MyVar = 5) { MsgBox, MyVar equals %MyVar%!! ExitApp }
In the following code, the message box is only shown if MyVar equals 5. The script will always exit, even if MyVar is not 5:
if (MyVar = 5) MsgBox, MyVar equals %MyVar%!! ExitApp
This is perfectly fine since the if-statement only had one line of code associated with it. It’s exactly the same as above, but I outdented the second line so we know it’s separated from the if-statement:
if (MyVar = 5) MsgBox, MyVar equals %MyVar%!! MsgBox, We are now 'outside' of the if-statement. We did not need curly brackets since there was only one line below it.