Что такое ahk и для чего его используют? как скачать и установить этот язык программирования?

Variables

Feature Description
A_Is64bitOS Contains 1 (true) if the OS is 64-bit or 0 (false) if it is 32-bit.
A_IsUnicode In Unicode builds, this variable contains 1 (true). In ANSI builds it is not defined, so is effectively false.
A_FileEncoding Contains the default encoding for various commands; see FileEncoding.
A_OSVersion Supports Windows 7 and Windows 8; see .
A_PriorKey The name of the last key which was pressed prior to the most recent key-press or key-release …
A_PtrSize Contains the size of a pointer, in bytes. This is either 4 (32-bit) or 8 (64-bit).
A_RegView The current registry view as set by SetRegView.
A_ScriptHwnd The unique ID (HWND/handle) of the script’s hidden main window.

CapsLock and IME

Some configurations of Windows IME (such as Japanese input with English keyboard) use CapsLock to toggle between modes. In such cases, CapsLock is suppressed by the IME and cannot be detected by AutoHotkey. However, the Alt+CapsLock, Ctrl+CapsLock and Shift+CapsLock shortcuts can be disabled with a workaround. Specifically, send a key-up to modify the state of the IME, but prevent any other effects by signalling the keyboard hook to suppress the event. The following function can be used for this purpose:

; Requires AutoHotkey v1.1.26+, and the keyboard hook must be installed.
#InstallKeybdHook
SendSuppressedKeyUp(key) {
    DllCall("keybd_event"
        , "char", GetKeyVK(key)
        , "char", GetKeySC(key)
        , "uint", KEYEVENTF_KEYUP := 0x2
        , "uptr", KEY_BLOCK_THIS := 0xFFC3D450)
}

After copying the function into a script or saving it as SendSuppressedKeyUp.ahk in a , it can be used as follows:

; Disable Alt+key shortcuts for the IME.
~LAlt::SendSuppressedKeyUp("LAlt")

; Test hotkey:
!CapsLock::MsgBox % A_ThisHotkey

; Remap CapsLock to LCtrl in a way compatible with IME.
*CapsLock::
    Send {Blind}{LCtrl DownR}
    SendSuppressedKeyUp("LCtrl")
    return
*CapsLock up::
    Send {Blind}{LCtrl Up}
    return

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. Посетите главную страницу AHK, нажмите Скачать на правой стороне, и выберите монтажник захватить самую простую версию для установки. Запустите диалог быстрой установки, и AutoHotkey будет запущен и готов к работе!

Теперь только что установленная программа обрабатывает выполнение сценариев, которые вы пишете на языке AutoHotkey, но у вас еще нет запущенных сценариев! Чтобы создать новый, убедитесь, что AutoHotkey запущен (откройте меню «Пуск» и введите AutoHotkey запустить программу), затем щелкните правой кнопкой мыши в любом месте на рабочем столе или в любом другом удобном месте и выберите New> AutoHotkey Script. Назовите это что-нибудь полезное и убедитесь, что файл заканчивается .АХК, или это не будет работать правильно.

Если вы собираетесь писать несколько сценариев для AutoHotkey, неплохо бы обновить ваш текстовый редактор из мягкого блокнота

, Notepad ++ — отличный бесплатный вариант, который рекомендуется для этой цели

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

Теперь, когда у вас есть программное обеспечение для запуска сценариев, вы можете загрузить код, написанный другими, для автоматизации всех видов задач. Чтобы сохранить скрипт, просто загрузите его как .АХК файл и сохранить его, где вы хотите.

Возможно, вы захотите, чтобы некоторые из этих сценариев запускались сразу после загрузки компьютера, поэтому вам не нужно каждый раз запускать их вручную. Для этого скопируйте и вставьте .АХК файлы в папку «Автозагрузка», набрав оболочка: запуск в меню «Пуск» или перейдя по следующему адресу:

Это обеспечит их запуск сразу после запуска, поэтому вы не пытаетесь использовать комбинации клавиш и ничего не получаете!

Optional Parameters

When defining a function, one or more of its parameters can be marked as optional. This is done by appending (in or later) or , followed by the parameter’s default value, which must be one of the following: , , a literal integer, a literal floating point number, or a quoted/literal string such as «fox» or «» (but strings in versions prior to support only «»).

The use of (without a colon) is permitted for backward-compatibility, but not recommended, and will not be permitted by AutoHotkey v2. Regardless of which operator is used, default values which are strings must always be enclosed in quote marks.

The following function has its Z parameter marked optional:

Add(X, Y, Z:=0) {
    return X + Y + Z
}

When the caller passes three parameters to the function above, Z’s default value is ignored. But when the caller passes only two parameters, Z automatically receives the value 0.

It is not possible to have optional parameters isolated in the middle of the parameter list. In other words, all parameters that lie to the right of the first optional parameter must also be marked optional. : Optional parameters may be omitted from the middle of the parameter list when calling the function, as shown below. For dynamic function calls and method calls, this requires .

MyFunc(1,, 3)
MyFunc(X, Y:=2, Z:=0) {  ; Note that Z must still be optional in this case.
    MsgBox %X%, %Y%, %Z%
}

: also support default values; for example: . Whenever the caller omits such a parameter, the function creates a local variable to contain the default value; in other words, the function behaves as though the keyword «ByRef» is absent.

Как пользоваться

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

Загрузка и установка

Начинать мы будем именно с установки. Тем более, что как таковой, ее здесь нет. Данная программа работает сразу после запуска. Рассмотрим, как его осуществить:

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

  1. Теперь нам необходимо предоставить доступ к администраторским полномочиям. В противном случае приложение не сможет корректно работать.

  1. На этом все. Наша программа установленная и теперь можно переходить непосредственно к работе с ней.

Инструкция по работе

Теперь давайте в общих чертах разберемся, как пользоваться данным приложением. Первое, что следует знать, это скриптовый язык программирования, который тут используется. Без него ни одного макроса написать, к сожалению, не получится. А сам алгоритм использования программы выглядит следующим образом:

  1. Вы пишите макрос, которым должна руководствоваться в своей работе AutoHotkey.
  2. Далее при помощи программы открываем данный скрипт и, при необходимости, преобразуем его в EXE-файл.
  3. Дальше мы можем использовать файл где угодно.

Вот так выглядит сам скрипт, а также созданный с его помощью исполняемый файл.

Parameters

When a function is defined, its parameters are listed in parentheses next to its name (there must be no spaces between its name and the open-parenthesis). If a function does not accept any parameters, leave the parentheses empty; for example: .

ByRef Parameters: From the function’s point of view, parameters are essentially the same as unless they are defined as ByRef as in this example:

Swap(ByRef Left, ByRef Right)
{
    temp := Left
    Left := Right
    Right := temp
}

In the example above, the use of ByRef causes each parameter to become an alias for the variable passed in from the caller. In other words, the parameter and the caller’s variable both refer to the same contents in memory. This allows the Swap function to alter the caller’s variables by moving Left’s contents into Right and vice versa.

By contrast, if ByRef were not used in the example above, Left and Right would be copies of the caller’s variables and thus the Swap function would have no external effect.

Since return can send back only one value to a function’s caller, ByRef can be used to send back extra results. This is achieved by having the caller pass in a variable (usually empty) in which the function stores a value.

When passing large strings to a function, ByRef enhances performance and conserves memory by avoiding the need to make a copy of the string. Similarly, using ByRef to send a long string back to the caller usually performs better than something like .

: If something other than a modifiable variable is passed to a ByRef parameter, the function behaves as though the keyword «ByRef» is absent. For example, stores the value of A_Index in i, but the value assigned to Left is discarded once the Swap function returns.

: The function can be used to determine whether the caller supplied a variable for a given ByRef parameter.

Known limitations:

  • Fields of objects are not considered variables for the purposes of ByRef. For example, if is passed to a ByRef parameter, it will behave as though ByRef was omitted.
  • It is not possible to pass Clipboard, , or to a function’s ByRef parameter, even when #NoEnv is absent from the script.
  • Although a function may call itself recursively, if it passes one of its own or non-ByRef parameters to itself ByRef, the new layer’s ByRef parameter will refer to its own local variable of that name rather than the previous layer’s. However, this issue does not occur when a function passes to itself a , , or ByRef parameter.
  • If a parameter in a function-call resolves to a variable (e.g. or or ), other parameters to its left or right can alter that variable before it is passed to the function. For example, would unexpectedly pass 1 and 0 when Var is initially 0, even when the function’s first parameter is not ByRef. Since this behavior is counterintuitive, it might change in a future release.
  • ByRef is not directly supported in functions called by COM clients, or when calling COM methods. Instead, the script receives or must pass a containing the VarType and address of the value.

Function Hotkeys [v1.1.20+]

One or more hotkeys can be assigned a function by simply defining it immediately after the hotkey label as in this example:

; Ctrl+Shift+O to open containing folder in Explorer.
; Ctrl+Shift+E to open folder with current file selected.
; Supports SciTE and Notepad++.
^+o::
^+e::
    editor_open_folder() {
        WinGetTitle, path, A
        if RegExMatch(path, "\*?\K(.*)\\+(?=  )", path)
            if (FileExist(path) && A_ThisHotkey = "^+e")
                Run explorer.exe /select`,"%path%"
            else
                Run explorer.exe "%path1%"
    }

: Hotstrings can also be defined this way. Multiple hotkeys or hotstrings can be stacked together to call the same function.

There must only be whitespace, comments or directives between the hotkey/hotstring labels or label and the function. Hotkey/hotstring labels defined this way are not visible to IsLabel(), Gosub or other commands; however, the ends at the first hotkey/hotstring even if it is assigned a function.

The main benefit of using a function is that local variables can be used, which avoids conflicts when two or more hotkeys use the same variable names for different purposes. It also encourages self-documenting hotkeys, like in the code above where the function name describes the hotkey.

The Hotkey command can also be used to assign a function or function object to a hotkey.

Сила AutoHotkey

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

У вас не должно возникнуть проблем с использованием AHK! Мы писали о том, как это может помочь вам более эффективно играть в Path of Exile

и, скорее всего, это может помочь с вашей любимой игрой. Не геймер? Объедините это с существующими ярлыками Microsoft Office

и вы будете более продуктивны, чем когда-либо прежде!

Какие ваши любимые варианты использования AutoHotkey? Поделитесь своими любимыми сценариями с нами ниже, чтобы расширить список!

Имидж Кредит: проведение стоматологического оборудования FabrikaSimf через Shutterstock

Moving the Mouse Cursor via the Keyboard

The keyboard can be used to move the mouse cursor as demonstrated by the fully-featured . Since that script offers smooth cursor movement, acceleration, and other features, it is the recommended approach if you plan to do a lot of mousing with the keyboard. By contrast, the following example is a simpler demonstration:

*#up::MouseMove, 0, -10, 0, R  ; Win+UpArrow hotkey => Move cursor upward
*#Down::MouseMove, 0, 10, 0, R  ; Win+DownArrow => Move cursor downward
*#Left::MouseMove, -10, 0, 0, R  ; Win+LeftArrow => Move cursor to the left
*#Right::MouseMove, 10, 0, 0, R  ; Win+RightArrow => Move cursor to the right

*<#RCtrl::  ; LeftWin + RightControl => Left-click (hold down Control/Shift to Control-Click or Shift-Click).
SendEvent {Blind}{LButton down}
KeyWait RCtrl  ; Prevents keyboard auto-repeat from repeating the mouse click.
SendEvent {Blind}{LButton up}
return

*<#AppsKey::  ; LeftWin + AppsKey => Right-click
SendEvent {Blind}{RButton down}
KeyWait AppsKey  ; Prevents keyboard auto-repeat from repeating the mouse click.
SendEvent {Blind}{RButton up}
return

Примеры

Программа «Привет, мир»:

1 ; Выводит стандартное окно с названием «Пример», надписью «Привет, мир!» и кнопкой «ОК».
2 MsgBox, , Пример, Привет, мир!

Создание диалогового окна:

1 ; Выводит диалоговое окно с кнопками «Да» и «Нет». В случае нажатия «Да» — выход из программы.
2 MsgBox, 4, Вопрос, Хотите выйти из программы? 
3 IfMsgBox, Yes
4     ExitApp
5 else
6     MsgBox, Спасибо что остались с нами.

Запуск блокнота:

1 Run, notepad.exe

Будильник на 12 часов и 00 минут:

 1 SetTimer, CheckTime, 300 ; Установка таймера на метку раз в 300 милисекунд.
 2 return ; Конец раздела автоматического выполнения. Сценарий приостанавливается, пока не сработает метка.
 3 
 4 CheckTime:
 5 	if (A_Hour == 12 && A_Min == 00) ; Если время настало.
 6 	{
 7 		ToolTip, Будильник. ; Выводим сообщение.
 8 		Sleep, 3000 ; Ждем 3 секунды.
 9 		ToolTip ; Скрываем сообщение.
10 	}
11 return

Скрытие/Показ курсора при нажатии Win + C.

 1 ; Скрывает/Показывает курсор мыши при нажатии клавиши Win + C.
 2 
 3 OnExit, ShowCursor ; При завершении работы скрипта, показываем курсор.
 4 return ; Конец раздела автоматического выполнения. Сценарий приостанавливается, пока пользователь не сделает что-нибудь.
 5 
 6 ShowCursor:
 7 	SystemCursor("On")
 8 ExitApp
 9 
10 #c::SystemCursor("Toggle") ; При нажатии на Win + C показываем/скрываем курсор.
11 
12 SystemCursor(status := 1)
13 {
14 	static AndMask, XorMask, $, hСursor
15 		, c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13 ; Системный курсор.
16 		, b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13 ; Пустой курсор.
17 		, h1,h2,h3,h4,h5,h6,h7,h8,h9,h10,h11,h12,h13 ; Дескрипторы курсора по умолчанию.
18 	if (status = "Init" or status = "I" or $ = "") ; Инициализация при первом вызове.
19 	{
20 		$ = h ; Активный курсор по умолчанию.
21 		VarSetCapacity( hСursor,4444, 1 )
22 		VarSetCapacity( AndMask, 32*4, 0xFF )
23 		VarSetCapacity( XorMask, 32*4,  )
24 		system_cursors = 32512,32513,32514,32515,32516,32642,32643,32644,32645,32646,32648,32649,32650
25 		StringSplit c, system_cursors, `,
26 		Loop %c0%
27 		{
28 			hСursor := DllCall("LoadCursor", "Ptr", , "Ptr", c%A_Index%)
29 			h%A_Index% := DllCall("CopyImage", "Ptr", hСursor, "UInt", 2, "Int", , "Int", , "UInt", )
30 			b%A_Index% := DllCall("CreateCursor", "Ptr", , "Int", , "Int", , "Int", 32, "Int", 32, "Ptr", &AndMask, "Ptr", &XorMask)
31         }
32     }
33 	if (status =  or status = "Off" or $ = "h" and (status <  or status = "Toggle" or status = "T"))
34 		$ = b  ; Используем пустой курсор.
35 	else
36 		$ = h  ; Используем системный курсор.
37 	
38 	Loop %c0%
39 	{
40 		hСursor := DllCall( "CopyImage", "Ptr",%$%%A_Index%, "UInt",2, "Int",, "Int",, "UInt", )
41 		DllCall("SetSystemCursor", "Ptr", hСursor, "UInt", c%A_Index%)
42 	}
43 }

Пример скрипта с использованием графического интерфейса:

 1 Gui, Add, Text,, Имя
 2 Gui, Add, Text,, Фамилия
 3 Gui, Add, Edit, vFirstName ym ; Параметр ym запускает новый столбец элементов управления.
 4 Gui, Add, Edit, vLastName
 5 Gui, Add, Button, default, OK ; Метка ButtonOK (если она существует) будет запущена при нажатии кнопки.
 6 Gui, Show,, Простой Пример Ввода
 7 return ; Конец раздела автоматического выполнения. Сценарий приостанавливается, пока пользователь не сделает что-нибудь.
 8 
 9 ButtonOK:
10 	Gui, Submit ; Сохраняет входные данные пользователя в связанную переменную каждого элемента управления.
11 	MsgBox Ваша Имя Фамилия "%FirstName% %LastName%".
12 GuiClose: ; Запускается при закрытии интерфейса.
13 ExitApp

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.

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

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

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

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

Скрипты 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:

Скрипт длинный, поэтому убедитесь, что полностью скопировали его.

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).

Introduction and Simple Examples

A function is similar to a subroutine (Gosub) except that it can accept parameters (inputs) from its caller. In addition, a function may optionally return a value to its caller. Consider the following simple function that accepts two numbers and returns their sum:

Add(x, y)
{
    return x + y   ; "Return" expects an .
}

The above is known as a function definition because it creates a function named «Add» (not case sensitive) and establishes that anyone who calls it must provide exactly two parameters (x and y). To call the function, assign its result to a variable with the := operator. For example:

Var := Add(2, 3)  ; The number 5 will be stored in Var.

Also, a function may be called without storing its return value:

Add(2, 3)

But in this case, any value returned by the function is discarded; so unless the function produces some effect other than its return value, the call would serve no purpose.

Since a function call is an , any variable names in its parameter list should not be enclosed in percent signs. By contrast, literal strings should be enclosed in double quotes. For example:

if (MyVar, "fox")
    MsgBox The variable MyVar contains the word fox.

Finally, functions may be called in the parameters of any command (except OutputVar and InputVar parameters such as those of StringLen). However, parameters that do not support must use the «% » prefix as in this example:

MsgBox % "The answer is: " . Add(3, 2)

The «% » prefix is also permitted in parameters that natively support expressions, but it is simply ignored.

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

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

Adblock
detector