# Hotkeys (atalhos de Mouse, Joystick e Teclado)

## Tabela de Conteúdos

- Introdução e Exemplos Simples
- Símbolos Modificadores de Hotkey
- Hotkeys Contexto-sensitivas
- Combinações Customizadas
- Outras Funções
- Hotkeys da Roda do Mouse
- Dicas e Observações sobre as Hotkeys
- Alt-Tab Hotkeys
- Hotkeys de Função [v1.1.20+]

## Introdução e Exemplos Simples

Às vezes, hotkeys são chamadas de teclas de atalho devido a sua habilidade de facilmente disparar uma ação (como iniciar um programa ou um macro de teclado). No seguinte exemplo, a hotkey `Win` + `N` foi configurada para iniciar o Bloco de Notas. O símbolo [#] representa a tecla `Win`, que também é conhecida como um modificador:

    #n::
    Run Notepad
    return

Na linha final acima, a palavra `return` serve para finalizar a hotkey. No entanto, se uma hotkey precisa executar apenas uma linha, essa linha pode ser listada à direita dos dois-pontos Em outras palavras, a palavra `return` é implícita:

    #n::Run Notepad

Para usar mais do que um modificador com uma hotkey, liste-as consecutivamente (a ordem não importa). O seguinte exemplo usa `^!s` para indicar `Control`+`Alt`+`S`:

    ^!s::
    Send Sincerely,{enter}John Smith  ; Esta linha envia teclas para a (principal) janela ativa.
    return

## Símbolos Modificadores de Hotkey

Você pode usar os seguinte símbolos modificadores para definir hotkeys:

Símbolo | Descrição
--- | ---
# | `Win` (Tecla do logotipo do Windows). [v1.0.48.01+]: Para Windows Vista e posterior, hotkeys que incluem a tecla `Win` (por exemplo, #a) aguardarão que a tecla `Win` seja solta antes de enviar qualquer texto contendo uma tecla `L`. Isso previne formas de uso de Send com alguma hotkey que bloqueie o PC. Esse comportamento pode ser aplicado para todos os modos Send, exceto SendPlay (que não precisa dele) e o modo blind. [v1.1.29+]: Modo texto também está excluído.. OBS: Pressionar uma hotkey que inclui a tecla `Win` pode resultar na simulação de teclas extras (`Ctrl` por padrão). Veja #MenuMaskKey.
! | `Alt` OBS: Pressionar uma hotkey qeu inclui a tecla `Alt` pode resultar em teclas simuladas extras (`Ctrl` por padrão). Veja #MenuMaskKey.
^ | `Control`
+ | `Shift`
& | Um "comercial" pode ser usado entre duas teclas ou botões de mouse quaisquer para combiná-los em uma hotkey customizada. Veja abaixo para mais detalhes.
< | Usa a tecla esquerda do par. Por exemplo, <!a é o mesmo que !a exceto que apenas a tecla `Alt` do lado esquerdo funcionará.
> | Use a tecla direita do par.
<^>! | `AltGr` (alternate graving). Se o layout do seu teclado possui `AltGr` ao invés de uma tecla `Alt` do lado direito, essa sequências de símbolos normalmente podem ser usada para significar `AltGr`. Por exemplo:
    <^>!m::MsgBox Você pressionou AltGr+m.
    <^<!m::MsgBox You pressed LeftControl+LeftAlt+m.
Alternativamente, para tornar `AltGr` por si próprio em uma hotkey, use a seguinte hotkey (sem quaisquer hotkeys mostradas acima):
    LControl & RAlt::MsgBox Você pressionou a própria tecla AltGr.
* | Wildcard: Fire the hotkey even if extra modifiers are being held down. This is often used in conjunction with remapping keys or buttons. Por exemplo:
    *#c::Run Calc.exe  ; Win+C, Shift+Win+C, Ctrl+Win+C, etc. will all trigger this hotkey.
    *ScrollLock::Run Notepad  ; Pressing ScrollLock will trigger this hotkey even when modifier key(s) are down.
Wildcard hotkeys always use the keyboard hook, as do any hotkeys eclipsed by a wildcard hotkey. For example, the presence of `*a::` would cause `^a::` to always use the hook.
~ | When the hotkey fires, its key's native function will not be blocked (hidden from the system). In both of the below examples, the user's click of the mouse button will be sent to the active window:
    ~RButton::MsgBox You clicked the right mouse button.
    ~RButton & C::MsgBox You pressed C while holding down the right mouse button.
Unlike the other prefix symbols, the tilde prefix is allowed to be present on some of a hotkey's variants but absent on others. However, if a tilde is applied to the prefix key of any custom combination which has not been turned off or suspended, it affects the behavior of that prefix key for all combinations. Special hotkeys that are substitutes for alt-tab always ignore the tilde prefix. [v1.1.14+]: If the tilde prefix is applied to a custom modifier key (prefix key) which is also used as its own hotkey, that hotkey will fire when the key is pressed instead of being delayed until the key is released. For example, the ~RButton hotkey above is fired as soon as the button is pressed. Prior to [v1.1.14] (or without the tilde prefix), it was fired when the button was released, but only if the RButton & C combination was not activated. If the tilde prefix is applied only to the custom combination and not the non-combination hotkey, the key's native function will still be blocked. For example, in the script below, holding `Menu` will show the ToolTip and will not trigger a context menu:
    AppsKey::ToolTip Press < or > to cycle through windows.
    AppsKey Up::ToolTip
    ~AppsKey & <::Send !+{Esc}
    ~AppsKey & >::Send !{Esc}
If at least one variant of a keyboard hotkey has the tilde modifier, that hotkey always uses the keyboard hook.
$ | This is usually only necessary if the script uses the Send command to send the keys that comprise the hotkey itself, which might otherwise cause it to trigger itself. The $ prefix forces the keyboard hook to be used to implement this hotkey, which as a side-effect prevents the Send command from triggering it. The $ prefix is equivalent to having specified `#UseHook` somewhere above the definition of this hotkey. The $ prefix has no effect for mouse hotkeys, since they always use the mouse hook. It also has no effect for hotkeys which already require the keyboard hook, including any keyboard hotkeys with the tilde (~) or wildcard (*) modifiers, key-up hotkeys and custom combinations. To determine whether a particular hotkey uses the keyboard hook, use ListHotkeys. [v1.1.06+]: #InputLevel and SendLevel provide additional control over which hotkeys and hotstrings are triggered by the Send command.
UP | The word UP may follow the name of a hotkey to cause the hotkey to fire upon release of the key rather than when the key is pressed down. The following example remaps the left `Win` key to become the left `Control` key:
    *LWin::Send {LControl down}
    *LWin Up::Send {LControl up}
"Up" can also be used with normal hotkeys as in this example: `^!r Up::MsgBox You pressed and released Ctrl+Alt+R`. It also works with combination hotkeys (e.g. `F1 & e Up::`) Limitations: 1) "Up" does not work with joystick buttons; and 2) An "Up" hotkey without a normal/down counterpart hotkey will completely take over that key to prevent it from getting stuck down. One way to prevent this is to add a tilde prefix (e.g. `~LControl up::`) "Up" hotkeys and their key-down counterparts (if any) always use the keyboard hook. On a related note, a technique similar to the above is to make a hotkey into a prefix key. The advantage is that although the hotkey will fire upon release, it will do so only if you did not press any other key while it was held down. Por exemplo:
    LControl & F1::return  ; Make left-control a prefix by using it in front of "&" at least once.
    LControl::MsgBox You released LControl without having used it to modify any other key.

Note: See the Key List for a complete list of keyboard keys and mouse/joystick buttons.

Multiple hotkeys can be stacked vertically to have them perform the same action. Por exemplo:

    ^Numpad0::
    ^Numpad1::
    MsgBox Pressing either Control+Numpad0 or Control+Numpad1 will display this message.
    return

A key or key-combination can be disabled for the entire system by having it do nothing. The following example disables the right-side `Win` key:

    RWin::return

## Hotkeys Contexto-sensitivas

The directives #IfWinActive/Exist and #If can be used to make a hotkey perform a different action (or none at all) depending on a specific condition. Por exemplo:

    #IfWinActive, ahk_class Notepad
    ^a::MsgBox You pressed Ctrl-A while Notepad is active. Pressing Ctrl-A in any other window will pass the Ctrl-A keystroke to that window.
    #c::MsgBox You pressed Win-C while Notepad is active.

    #IfWinActive
    #c::MsgBox You pressed Win-C while any window except Notepad is active.

    #If MouseIsOver("ahk_class Shell_TrayWnd") ; For MouseIsOver, see #If example 1.
    WheelUp::Send {Volume_Up}     ; Wheel over taskbar: increase/decrease volume.
    WheelDown::Send {Volume_Down} ;

## Combinações Customizadas

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. [v1.1.14+]: This behaviour can be avoided by applying the tilde prefix to either hotkey.

Modifiers: Unlike a normal hotkey, custom combinations act as though they have the wildcard (*) modifier by default. For example, `1 & 2::` will activate even if `Ctrl` or `Alt` is held down when `1` and `2` are pressed, whereas `^1::` 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, `<+s::` is recommended over `LShift & s::`.

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

    ; 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("[") && 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, `a & b::` causes `^a::` to always use the hook.

## Outras Funções

NumLock, CapsLock, and ScrollLock: These keys may be forced to be "AlwaysOn" or "AlwaysOff". For example: `SetNumLockState AlwaysOn`.

Overriding Explorer's hotkeys: Windows' built-in hotkeys such as `Win`+`E` (#e) and `Win`+`R` (#r) can be individually overridden simply by assigning them to an action in the script. See the override page for details.

Substitutes for Alt-Tab: Hotkeys can provide an alternate means of alt-tabbing. For example, the following two hotkeys allow you to alt-tab with your right hand:

    RControl & RShift::AltTab  ; Hold down right-control then press right-shift repeatedly to move forward.
    RControl & Enter::ShiftAltTab  ; Without even having to release right-control, press Enter to reverse direction.

For more details, see Alt-Tab.

## Hotkeys da Roda do Mouse

Hotkeys that fire upon turning the mouse wheel are supported via the key names WheelDown and WheelUp. Here are some examples of mouse wheel hotkeys:

    MButton & WheelDown::MsgBox You turned the mouse wheel down while holding down the middle button.
    ^!WheelUp::MsgBox You rotated the wheel up while holding down Control+Alt.

[v1.0.48+]: WheelLeft and WheelRight are also supported, but have no effect on operating systems older than Windows Vista. Some mice have a single wheel which can be scrolled up and down or tilted left and right. Generally in those cases, WheelLeft or WheelRight signals are sent repeatedly while the wheel is held to one side, to simulate continuous scrolling. This typically causes the hotkeys to execute repeatedly.

[v1.0.43.03+]: The built-in variable A_EventInfo contains the amount by which the wheel was turned, which is typically 1. However, A_EventInfo can be greater or less than 1 under the following circumstances:

- If the mouse hardware reports distances of less than one notch, A_EventInfo may contain 0;
- If the wheel is being turned quickly (depending on type of mouse), A_EventInfo may be greater than 1. A hotkey like the following can help analyze your mouse: `~WheelDown::ToolTip %A_EventInfo%`.

Some of the most useful hotkeys for the mouse wheel involve alternate modes of scrolling a window's text. For example, the following pair of hotkeys scrolls horizontally instead of vertically when you turn the wheel while holding down the left `Control` key:

    ~LControl & WheelUp::  ; Scroll left.
    ControlGetFocus, fcontrol, A
    Loop 2  ; <-- Increase this value to scroll faster.
        SendMessage, 0x114, 0, 0, %fcontrol%, A  ; 0x114 is WM_HSCROLL and the 0 after it is SB_LINELEFT.
    return

    ~LControl & WheelDown::  ; Scroll right.
    ControlGetFocus, fcontrol, A
    Loop 2  ; <-- Increase this value to scroll faster.
        SendMessage, 0x114, 1, 0, %fcontrol%, A  ; 0x114 is WM_HSCROLL and the 1 after it is SB_LINERIGHT.
    return

Finally, since mouse wheel hotkeys generate only down-events (never up-events), they cannot be used as key-up hotkeys.

## Dicas e Observações sobre as Hotkeys

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 `NumLock` state. Por exemplo:

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

If the tilde (~) operator is used with a prefix key 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 ^ (`Control`) and # (`Win`). However, you can use GetKeyState 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 `Control`+`Alt`+`S` would cause the system to behave as though you pressed `Control`+`Alt`+`Delete` (due to the system's aggressive detection of `Ctrl`+`Alt`+`Delete`). 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 `#z::` 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: `Gosub ^!s`.

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 this FAQ topic.

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 MsgBox is being displayed by the current hotkey.

## Alt-Tab Hotkeys

Each Alt-Tab hotkey must be a combination of two keys, which is typically achieved via the ampersand symbol (&). In the following example, you would hold down the right `Alt` key and press `J` or `K` to navigate the alt-tab menu:

    RAlt & j::AltTab
    RAlt & k::ShiftAltTab

AltTab and ShiftAltTab are two of the special commands that are only recognized when used on the same line as a hotkey. Here is the complete list:

AltTab: If the alt-tab menu is visible, move forward in it. Otherwise, display the menu (only if the hotkey is an "&" combination of two keys; otherwise, it does nothing).

ShiftAltTab: Same as above except move backward in the menu.

AltTabMenu: Show or hide the alt-tab menu.

AltTabAndMenu: If the alt-tab menu is visible, move forward in it. Otherwise, display the menu.

AltTabMenuDismiss: Close the Alt-tab menu.

To illustrate the above, the mouse wheel can be made into an entire substitute for Alt-tab. With the following hotkeys in effect, clicking the middle button displays the menu and turning the wheel navigates through it:

    MButton::AltTabMenu
    WheelDown::AltTab
    WheelUp::ShiftAltTab

To cancel a hotkey-invoked Alt-tab menu without activating the selected window, use a hotkey such as the following. It might require adjustment depending on: 1) the means by which the alt-tab menu was originally displayed; and 2) whether the script has the keyboard hook installed.

    LCtrl & CapsLock::AltTab
    !MButton::  ; Middle mouse button. The ! prefix makes it fire while the Alt key is down (which it is if the alt-tab menu is visible).
    if WinExist("ahk_class #32771")  ; Indicates that the alt-tab menu is present on the screen.
        Send !{Escape}{Alt up}
    return

Currently, all special Alt-tab actions must be assigned directly to a hotkey as in the examples above (i.e. they cannot be used as though they were commands). They are not affected by #IfWin or #If.

Custom alt-tab actions can also be created via hotkeys. In the following example, you would press `F1` to display the menu and advance forward in it. Then you would press `F2` to activate the selected window (or press `Escape` to cancel):

    *F1::Send {Alt down}{tab} ; Asterisk is required in this case.
    !F2::Send {Alt up}  ; Release the Alt key, which activates the selected window.
    ~*Escape::
    if WinExist("ahk_class #32771")
        Send {Escape}{Alt up}  ; Cancel the menu without activating the selected window.
    return

## 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%"
        }

[v1.1.28+]: 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 auto-execute section 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.