Hotkey

스크립트가 실행되는 동안에 핫키를 만들고, 변경하고, 켜고 끕니다.

Hotkey, KeyName , Label, Options
Hotkey, IfWinActive/Exist , WinTitle, WinText
Hotkey, If , Expression
Hotkey, If, % FunctionObject

매개변수

KeyName

핫키 활성화 키의 이름, 수식 심볼을 포함. 예를 들어, Win+C 핫키라면 #c를 지정합니다.

KeyName이 이미 핫키로 존재하면, 그 핫키는 그 명령어의 다른 매개변수들의 값을 가지고 갱신됩니다.

KeyName은 기존의 핫키 라벨의 이름이 될 수도 있습니다 (즉, 겹-쌍점 라벨). 그런 경우 핫키는 그 명령어의 다른 매개변수들의 값을 가지고 갱신됩니다.

기존의 핫키를 지정할 때, KeyName은 대소문자를 구분하지 않습니다. 그렇지만, 키의 이름은 반드시 기존의 핫키와 철자가 같아야 합니다 (예,. 이런 목적으로 Esc는 Escape와 같지 않습니다). 또, ^!+#와 같은 수식 심볼 순서는 문제가 되지 않습니다. GetKeyName()을 사용하면 키 이름의 표준 철자를 열람할 수 있습니다.

핫키가 처음 만들어질 때 -- Hotkey 명령어 또는 겹-쌍점 라벨을 사용하여 -- 그의 키 이름과 그의 수식 심볼의 순서는 그 핫키의 영구한 이름이 되어 A_ThisHotkey에 반영됩니다. 이 이름은 그 핫키의 모든 변형이 공유하고, 바뀌지 않습니다. 나중에 Hotkey 명령어가 그 핫키에 다른 심볼 순서를 가지고 접근해도 마찬가지입니다.

[v1.1.15+]: 핫키 변형이 이미 존재하면, 그의 행위는 KeyName틸드 (~) 접두사가 있는가 없는가에 맞게 갱신됩니다. 그렇지만, [v1.1.19] 이전에서, 핫키는 Label이 생략되면 갱신되지 않았습니다.

[v1.1.19+]: 갈고리 사용 ($) 접두 심볼을 기존의 핫키에 추가할 수 있습니다. 이 접두 심볼은 핫키의 모든 변형에 영향을 주며 제거가 불가능합니다. [v1.1.19]이전에서, 기존 핫키의 변형을 변경할 때 이 접두 심볼은 무시되었습니다.

Label

핫키가 눌릴 때 그의 내용이 (새로운 쓰레드로) 실행될 라벨의 이름. Both normal labels and hotkey/hotstring labels can be used, but if the script contains multiple labels with the same name, only the first can be used. 뒤에 따라오는 쌍점은 포함하면 안됩니다. Label이 동적이면 (예, %VarContainingLabelName%), IsLabel(VarContainingLabelName)을 미리 호출해 그 라벨이 존재하는지 확인할 수 있습니다.

[v1.1.20+]: 유효하지 않은 라벨 이름이라면, 이 매개변수는 함수의 이름, 또는 (함수 객체를 담고 있는) 단일 변수 참조일 수 있습니다. For example, Hotkey #z, %FuncObj%, On or Hotkey #z, % FuncObj, On. 함수 객체를 돌려주는 다른 표현식은 현재 지원하지 않습니다. 핫키가 실행될 때, 함수는 매개변수 없이 호출됩니다. 핫키는 함수로 정의될 수 있습니다. Hotkey 명령어가 필요없습니다.

이 매개변수는 KeyName이 이미 핫키로 존재하면 빈 채로 있을 수 있습니다. 그런 경우, 그의 라벨은 바뀌지 않습니다. 이것은 핫키의 옵션만 바꿀 때 유용합니다.

주의: 라벨 또는 함수가 지정되어 있지만 핫키는 이전에 이 명령어 때문에 꺼져 있다면, 그 핫키는 여전히 꺼진 채로 있을 것입니다. 이를 피하려면 단어 ON을 Options에 포함시키십시오.

이 매개변수는 다음 특수 값들 중 하나가 될 수도 있습니다:

On: 핫키가 활성화 됩니다. 핫키가 이미 켜져 있다면 아무 조치도 없습니다.

Off: 핫키가 비활성화 됩니다. 핫키가 이미 꺼져 있다면 아무 조치도 없습니다.

Toggle: 핫키를 반대 상태로 설정합니다 (enabled 또는 disabled).

AltTab (기타 등등): 이것들은 특수한 Alt-Tab 핫키 초치들로서 여기에 기술되어 있습니다.

주의: 이름이 On, Off, Toggle 또는 AltTab으로 (또는 이 명령어로 인지되는 기타 변형으로) 라벨을 정의하면 일관성 없는 행위를 야기할 수 있습니다. 이런 값들은 절대로 라벨 이름으로 사용하지 않기를 바랍니다.

Options

다음 기호들과 선택적으로 그 사이에 스페이스가 있는 문자열. 예를 들어: UseErrorLevel B0.

UseErrorLevel: 명령억 문제를 만나면, 이 옵션은 경고 대화상자를 건너뛰고, ErrorLevel아래 테이블의 코드 중 하나를 설정한 다음, 현재 쓰레드를 계속 실행시킵니다.

On: 핫키가 현재 꺼져 있으면 켭니다.

Off: 핫키가 현재 켜져 있으면 끕니다. 이는 전형적으로 처음에 끈 상태로 시작하는 핫키를 만드는 데 사용됩니다.

B 또는 B0: 기호 B를 지정하면 핫키를 #MaxThreadsBuffer에 기술된 대로 버퍼 처리합니다. B0 (B 다음에 영)을 지정하면 이 유형의 버퍼 처리를 끌 수 있습니다.

Pn: 기호 P 다음에 핫키의 쓰레드 우선 순위를 지정하십시오. 핫키를 만들 때 P 옵션을 생략하면, 0이 사용 됩니다.

Tn: #MaxThreadsPerHotkey에 기술된 것처럼 기호 T 다음에 이 핫키에 허용할 쓰레드의 개수를 지정합니다. 예를 들어: T5.

In (InputLevel) [v1.1.23+]: Specify the letter I (or i) followed by the hotkey's input level. 예를 들어: I1.

If any of the option letters are omitted and the hotkey already exists, those options will not be changed. 그러나 핫키가 아직 존재하지 않으면 -- 즉, 이 명령어로 생성될 예정이라면 -- 옵션은 최근에 효과가 있던 옵션이 기본값이 됩니다. 예를 들어, 스크립트 아래에 최대한 가깝게 나타나는 #MaxThreadsBuffer의 실체가 사용됩니다. #MaxThreadsBuffer가 스크립트에 나타나지 않으면, 그의 기본 설정이 (이 경우에는 OFF가) 사용됩니다. 이 행위는 #IfWin에도 적용됩니다: 가장 아래쪽에 나타나는 실체가 새로 생성된 핫키에 적용됩니다. 단, 스크립트가 시작된 이후로 "Hotkey IfWin"이 실행된 경우는 예외입니다.

IfWinActive
IfWinExist
IfWinNotActive
IfWinNotExist
If, Expression
If, % FunctionObject

이부-명령어들은 연이어 생성되는 모든 핫키가 문맥을 감지하게 만듭니다. 자세한 것은 아래를 참조합니다.

WinTitle
WinText

이 매개변수들 안에서, %var%와 같은 변수 참조는 모두 명령어가 완료되는 순간 영속적이 됩니다. 다른 말로, 그 다음부터 변수의 내용에 가하는 변경을 기존의 IfWin 핫키들은 보지 못합니다.

#IfWinActive/Exist처럼, WinTitle 그리고 WinTextSetTitleMatchMode 그리고 DetectHiddenWindows자동-실행 섹션에 설정된 대로 기본 설정을 사용합니다. 더 자세한 것은 #IfWinActive/Exist를 참조하십시오.

If, Expression

[AHK_L 4+]: Associates subsequently-created hotkeys with a given #If expression. Expression must be an expression which has been used with the #If directive elsewhere in the script. 이 명령어는 새 표현식을 만들 수 없지만, 기존의 표현식을 사용하여 핫키를 새로 만들 수 있습니다. #If 예제 4를 참조하십시오.

Note: The Hotkey command uses the string that you pass to it, not the original source code. Commas and deref chars (percent signs) are interpreted before the command is called, so may need to be escaped if they are part of the original expression. Escape sequences are resolved when the script loads, so only the resulting characters are considered; for example, Hotkey, If, x = "`t" and Hotkey, If, % "x = """ A_Tab """" both correspond to #If x = "`t".

알려진 한계: Expressionand/or 연산자가 포함되어 있으면, 기존의 표현식으로 인지되지 않습니다. 우회책으로, 동등한 &&/|| 연산자를 원래의 #If 표현식과 Hotkey 명령어에 건넨 표현식에 모두 사용하십시오.

If, % FunctionObject

[v1.1.25+]: Associates subsequently-created hotkeys with a given function object. Such hotkeys will only execute if calling the given function object yields a non-zero number. This is like Hotkey, If, Expression, except that each hotkey can have many variants (one per object). FunctionObject must be a single variable (not an expression) containing an object with a call method. The function or call method can accept one parameter, the name of the hotkey.

Once passed to the Hotkey command, the object will never be deleted (but memory will be reclaimed by the OS when the process exits).

The "three-key combination" example below uses this sub-command.

에러 처리

[v1.1.04+]: 이 명령어는 실패하면 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 다음과 같을 경우에만 바뀝니다: 1) 첫 번째 매개변수가 IfWin[Not]Active/Exist인 경우 문제 있으면 1이 설정되고 그렇지 않으면 0이 설정됩니다; 또는 2) 단어 UseErrorLevel이 Options 매개변수에 존재하는 경우입니다.

[v1.1.25+]: If the first parameter is "If", an exception is thrown if the second parameter is invalid or a memory allocation fails. ErrorLevel is not set in those cases, but is still set to 0 on success.

Error 설명
1 Label 매개변수가 존재하지 않는 라벨 이름을 지정합니다.
2 KeyName 매개변수는 현재 키보드 레이아웃/언어가 인지하지 못하거나 지원하지 않는 하나 이상의 키를 지정합니다.
3 지원되지 않는 접두 키. 예를 들어, WheelDown & Enter과 같이 마우스 휠을 핫키에 접두 키로 사용하는 것은 지원되지 않습니다.
4 KeyName 매개변수가 AltTab 또는 ShiftAltTab 조치와 함께 사용하기에 적합하지 않습니다. A combination of (at most) two keys is required. 예를 들어: RControl & RShift::AltTab.
5 명령어가 존재하지 않는 핫키를 변경하려고 시도했습니다.
6 명령어가 존재하지 않는 기존 핫키의 변형을 변경하려고 시도했습니다. 이를 해결하려면, Hotkey IfWin를 사용해 변경될 그 핫키의 변형이 부합할 기준을 설정하십시오.
98 Creating this hotkey would exceed the limit of hotkeys per script (however, each hotkey can have an unlimited number of variants, and there is no limit to the number of hotstrings). The limit was raised from 700 to 1000 in [v1.0.48], and to 32762 in [v1.1.30].
99 메모리 고갈. 아주 희귀한 경우이며 보통 운영 체제가 불안정한 상태가 될 경우에만 일어납니다.

팁: UseErrorLevel 옵션은 핫키 변형의 존재를 테스트 하는 데 사용할 수 있습니다. 예를 들어:

Hotkey, ^!p,, UseErrorLevel
if ErrorLevel in 5,6
    MsgBox 핫키가 존재하지 않습니다. 아니면 현재 IfWin 기준에 맞는 변형이 없습니다.

논평

현재의 IfWin 설정은 Hotkey 명령어가 처리할 핫키의 변형을 결정합니다.

선택된 핫키와 핫스트링을 현재 활성 창의 유형에 기반하여 자동으로 끄는 것이 목적이라면, Hotkey, ^!c, Off보다 보통 #IfWinActive/Exist를 (또는 동적인 상대인 아래의 "Hotkey IfWinActive/Exist"를) 사용하는 것이 더 편리합니다.

겹-쌍점 라벨을 통하여 핫키를 만드는 것이 Hotkey 명령어를 사용하는 방법보다 더 수행성능이 좋습니다. 왜냐하면 스크립트가 시작할 때 핫키를 (하나 씩이 아니라) 모두 일괄적으로 켤 수 있기 때문입니다. 그러므로, 스크립트가 실행을 시작해야만 이름을 알 수 있는 키들을 생성하는 데에만 이 명령어를 사용하는 것이 제일 좋습니다. 그런 경우 한 가지는 다양한 행위에 대한 스크립트의 핫키를 INI 파일을 통하여 환경구성할 때입니다.

주어진 라벨은 여러 핫키의 목표가 될 수 있습니다. 라벨이 핫키에 호출되었다면, 내장 변수 A_ThisHotkey를 점검하면 어느 핫키인지 알아낼 수 있습니다.

스크립트가 보류(suspended) 중이라면, 새로 추가된/활성화된 핫키도 보류가 꺼질 때까지 함께 보류됩니다 (단, Suspend 섹션에 기술된 대로 면제된 경우는 예외입니다).

이 명령어가 가한 변경 때문에 정당성을 얻으면 키보드 그리고/또는 마우스 갈고리가 설치되거나 제거됩니다.

Hotkey 명령어는 자신의 소유가 아닌 스크립트에서 직접적으로 핫키를 켜거나 끌 수 없지만, 대부분의 경우 같은 핫키들을 만들거나 활성화 함으로써 오버라이드 할 수 있습니다. 이것의 작동 여부는 다음 요인의 조합에 따라 다릅니다: 1) 오버라이드 될 핫키가 다른 스크립트에서 갈고리 핫키인가 (비-갈고리 핫키는 언제나 오버라이드할 수 있습니다); 2) 최근에 시작된 스크립트의 핫키가 일반적으로 다른 스크립트의 핫키보다 우선 순위가 높다는 사실 (그러므로, 오버라이드 할 스크립트가 최근에 시작되었다면, 그의 오버라이드는 언제나 성공합니다); 3) 이 핫키를 활성화 하거나 생성하면 새로 키보드 또는 마우스 갈고리가 활성화 되는가 (그렇다면, 오버라이드는 언제나 성공합니다).

스크립트에 하나의 핫키만 있어도, 스크립트는 영속적이 됩니다. Exit이 아니라 ExitApp를 사용해야 종료할 수 있다는 뜻입니다. 핫키 스크립트는 또 자동으로 #SingleInstance가 됩니다. 단, #SingleInstance Off가 지정된 경우는 예외입니다.

에 대한 발언: Hotkey, If

The "Hotkey If" commands allow context-sensitive hotkeys to be created and modified while the script is running (by contrast, the #If and #IfWinActive/Exist directives are positional and take effect before the script begins executing). 예를 들어:

Hotkey, IfWinActive, ahk_class Notepad
Hotkey, ^!e, MyLabel  ; 노트패드에서만 작동하는 핫키를 생성합니다.

"Hotkey If"를 사용하면 뒤이어 생성되거나 변경되는 모든 핫키에 문맥 감지가 영향을 미칩니다. 게다가, If 부-명령어는 서로 배타적입니다; 즉, 최근의 부-명령어만 효과가 있습니다.

문맥 감지를 끄려면 (즉, 이어서 생성되는 핫키를 모든 창에 작동시키려면), If 부-명령어를 지정하되 매개변수를 생략하십시오. 예를 들어: Hotkey, If or Hotkey, IfWinActive.

If "Hotkey If" is never used by a script, the bottommost use of any #If or #IfWin directive (if any) will be in effect for the Hotkey command.

When a mouse or keyboard hotkey is disabled via an If sub-command or directive, it performs its native function; that is, it passes through to the active window as though there is no such hotkey. However, joystick hotkeys always pass through, whether they are disabled or not.

변종 (중복) 핫키

특정 핫키는 각 정의마다 IfWin 기준이 다르다면 한 번 이상 만들 수 있습니다. 이런 것들을 핫키 변형이라고 부릅니다. 예를 들어:

Hotkey, IfWinActive, ahk_class Notepad
Hotkey, ^!c, MyLabelForNotepad
Hotkey, IfWinActive, ahk_class WordPadClass
Hotkey, ^!c, MyLabelForWordPad
Hotkey, IfWinActive
Hotkey, ^!c, MyLabelForAllOtherWindows

핫키의 변형이 하나 이상 촉발할 수 있다면, 가장 일찍 만들어진 변형만 촉발됩니다. 이에 대한 예외는 전역 변형입니다 (IfWin 기준이 없는 변형): 항상 우선 순위가 낮습니다. 그래서 다른 변형이 전혀 촉발될 수 없을 때만 촉발됩니다.

중복 핫키를 만들 때, ^!+#와 같은 수식 심볼의 순서는 문제가 되지 않습니다. 예를 들어, ^!c!^c와 동일합니다. 그렇지만, 키는 일관성이 있게 철자가 되어야 합니다. 예를 들어, 이런 목적으로 EscEscape와 같지 않습니다 (그렇지만 대소문자는 문제가 되지 않습니다). 마지막으로, 와일드카드 접두 심볼 (*)을 가진 핫키는 모두 비-와일드카드 핫키와 완전히 다릅니다; 예를 들어, *F1F1는 각각 자신의 변형을 가집니다.

IfWin 핫키에 관한 더 자세한 정보는 #IfWin의 총평을 참조하십시오.

핫키 심볼, #IfWinActive/Exist, #MaxThreadsBuffer, #MaxThreadsPerHotkey, Suspend, IsLabel(), Threads, Thread, Critical, Gosub, Return, Menu, SetTimer

예제

Creates a Ctrl-Alt-Z hotkey.

Hotkey, ^!z, MyLabel
return

MyLabel:
MsgBox You pressed %A_ThisHotkey%.
return

RCtrl & RShift를 Alt-Tab 처럼 작동하도록 만듭니다.

Hotkey, RCtrl & RShift, AltTab

Win-C 핫키를 재활성화합니다.

Hotkey, #c, On

Shift-Win-C 핫키를 끕니다.

Hotkey, $+#c, Off

Changes a hotkey to allow 5 threads.

Hotkey, ^!a, , T5

Creates a Ctrl-Alt-C hotkey that works only in Notepad.

Hotkey, IfWinActive, ahk_class Notepad
Hotkey, ^!c, MyLabelForNotepad

Creates a GUI that allows to register primitive three-key combination hotkeys.

Gui Add, Text, xm, Prefix key:
Gui Add, Edit, yp x100 w100 vPrefix, Space
Gui Add, Text, xm, Suffix hotkey:
Gui Add, Edit, yp x100 w100  vSuffix, f & j
Gui Add, Button, Default, Register
Gui Show
return

ButtonRegister() {
    global
    Gui Submit, NoHide
    local fn
    fn := Func("HotkeyShouldFire").Bind(Prefix)
    Hotkey If, % fn
    Hotkey % Suffix, FireHotkey
}

HotkeyShouldFire(prefix, thisHotkey) {
    return GetKeyState(prefix)
}

FireHotkey() {
    MsgBox %A_ThisHotkey%
}

GuiClose:
GuiEscape:
ExitApp