Hotkey
스크립트가 실행되는 동안에 핫키를 만들고, 변경하고, 켜고 끕니다.
Hotkey, KeyName [, Label, Options] Hotkey, IfWinActive/Exist [, WinTitle, WinText] Hotkey, If [, Expression]
매개변수
- 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
핫키가 눌릴 때 그의 내용이 (새로운 쓰레드로) 실행될 라벨의 이름. 정상 라벨과 핫키/핫스트링 라벨을 모두 사용할 수 있습니다. 뒤에 따라오는 쌍점은 포함하면 안 됩니다. Label이 동적이면 (예, %VarContainingLabelName%), IsLabel(VarContainingLabelName)을 미리 호출해 그 라벨이 존재하는지 확인할 수 있습니다.
[v1.1.20+]: 유효하지 않은 라벨 이름이라면, 이 매개변수는 함수의 이름, 또는 (함수 객체를 담고 있는) 단일 변수 참조일 수 있습니다. 예를 들어,
Hotkey %funcobj%, On
또는Hotkey % 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
.B나 T 옵션 기호가 생략되고 그리고 핫키가 이미 존재하면, 그런 옵션은 바뀌지 않습니다. 그러나 핫키가 아직 존재하지 않으면 -- 즉, 이 명령어로 생성될 예정이라면 -- 옵션은 최근에 효과가 있던 옵션이 기본값이 됩니다. 예를 들어, 스크립트 아래에 최대한 가깝게 나타나는 #MaxThreadsBuffer의 실체가 사용됩니다. #MaxThreadsBuffer가 스크립트에 나타나지 않으면, 그의 기본 설정이 (이 경우에는 OFF가) 사용됩니다. 이 행위는 #IfWin에도 적용됩니다: 가장 아래쪽에 나타나는 실체가 새로 생성된 핫키에 적용됩니다. 단, 스크립트가 시작된 이후로 "Hotkey IfWin"이 실행된 경우는 예외입니다.
- IfWinActive
IfWinExist (IfWinNotActive 그리고 IfWinNotExist도 지원합니다). 이부-명령어들은 연이어 생성되는 모든 핫키가 문맥을 감지하게 만듭니다. 자세한 것은 아래 참조.
- WinTitle
WinText 이 매개변수들 안에서, %var%와 같은 변수 참조는 모두 명령어가 완료되는 순간 영속적이 됩니다. 다른 말로, 그 다음부터 변수의 내용에 가하는 변경을 기존의 IfWin 핫키들은 보지 못합니다.
#IfWinActive/Exist처럼, WinTitle 그리고 WinText는 SetTitleMatchMode 그리고 DetectHiddenWindows에 자동-실행 섹션에 설정된 대로 기본 설정을 사용합니다. 더 자세한 것은 #IfWinActive/Exist를 참조하십시오.
- If, Expression
-
[AHK_L]: #If Expression의 상대편. Expression은 기존의
#If Expression
에서 "#If
" 또는 "#If,
"를 제외한 텍스트에 정확하게 부합해야 합니다. Hotkey 명령어에 사용될 때, 쉼표가 "If"가 뒤에 필요합니다. 이 명령어는 새 표현식을 만들 수 없지만, 기존의 표현식을 사용하여 핫키를 새로 만들 수 있습니다. #If 예제 4를 참조하십시오.알려진 한계: Expression에
and
/or
연산자가 포함되어 있으면, 기존의 표현식으로 인지되지 않습니다. 우회책으로, 동등한&&
/||
연산자를 원래의 #If 표현식과 Hotkey 명령어에 건넨 표현식에 모두 사용하십시오.
ErrorLevel
[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.
ErrorLevel은 다음과 같을 경우에만 바뀝니다: 1) 첫 번째 매개변수가 IfWin[Not]Active/Exist인 경우 문제 있으면 1이 설정되고 그렇지 않으면 0이 설정됩니다; 또는 2) 단어 UseErrorLevel이 Options 매개변수에 존재하는 경우입니다.
에러 | 설명 |
---|---|
1 | Label 매개변수가 존재하지 않는 라벨 이름을 지정합니다. |
2 | KeyName 매개변수는 현재 키보드 레이아웃/언어가 인지하지 못하거나 지원하지 않는 하나 이상의 키를 지정합니다. |
3 | 지원되지 않는 접두 키. 예를 들어, WheelDown & Enter 과 같이 마우스 휠을 핫키에 접두 키로 사용하는 것은 지원되지 않습니다. |
4 | KeyName 매개변수가 AltTab 또는 ShiftAltTab 조치와 함께 사용하기에 적합하지 않습니다. 두 키의 조합이 필요합니다. 예를 들어: RControl & RShift::AltTab . |
5 | 명령어가 존재하지 않는 핫키를 변경하려고 시도했습니다. |
6 | 명령어가 존재하지 않는 기존 핫키의 변형을 변경하려고 시도했습니다. 이를 해결하려면, Hotkey IfWin를 사용해 변경될 그 핫키의 변형이 부합할 기준을 설정하십시오. |
98 | 이 핫키를 생성하면 스크립트-당-1000-핫키 제한을 초과합니다 (그렇지만, 각 핫키는 무한 개수의 변형을 가질 수 있으며, 핫스트링의 개수에도 제한이 없습니다). |
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 명령어는 자신의 소유가 아닌 스크립트에서 직접적으로 핫키를 켜거나 끌 수 없지만, 대부분의 경우 같은 핫키들을 만들거나 활성화 함으로써 오버라이드 할 수 있습니다. 이것의 작동 여부는 다음 요인의 조합에 따라 다릅니다:
- 오버라이드 될 핫키가 다른 스크립트에서 갈고리 핫키인가 (비-갈고리 핫키는 언제나 오버라이드할 수 있습니다);
- 최근에 시작된 스크립트의 핫키가 일반적으로 다른 스크립트의 핫키보다 우선 순위가 높다는 사실 (그러므로, 오버라이드 할 스크립트가 최근에 시작되었다면, 그의 오버라이드는 언제나 성공합니다);
- 이 핫키를 활성화 하거나 생성하면 새로 키보드 또는 마우스 갈고리가 활성화 되는가 (그렇다면, 오버라이드는 언제나 성공합니다).
스크립트에 하나의 핫키만 있어도, 스크립트는 영속적이 됩니다. Exit이 아니라 ExitApp를 사용해야 종료할 수 있다는 뜻입니다. 핫키 스크립트는 또 자동으로 #SingleInstance가 됩니다. 단, #SingleInstance Off
가 지정된 경우는 예외입니다.
Hotkey, IfWinXX [, WinTitle, WinText]에 관한 논평
"Hotkey IfWin" 명령어는 스크립트가 실행중인 동안에 문맥 감지 핫키를 생성하도록 허용합니다 (대조적으로, #IfWinActive/Exist 지시어는 위치에 민감하고 스크립트가 실행을 시작하기 전에 효과가 있습니다). 예를 들어:
Hotkey, IfWinActive, ahk_class Notepad Hotkey, ^!e, MyLabel ; 노트패드에서만 작동하는 핫키를 생성합니다.
"Hotkey IfWin"를 사용하면 뒤이어 생성되거나 변경되는 모든 핫키에 문맥 감지가 영향을 미칩니다. 게다가, IfWin 부-명령어는 서로 배타적입니다; 즉, 최근의 부-명령어만 효과가 있습니다.
문맥 감지를 끄려면 (즉, 이어서 생성되는 핫키를 모든 창에 작동시키려면), IfWin 부-명령어를 지정하되 WinTitle/Text 매개변수를 생략하십시오. 예를 들어: Hotkey, IfWinActive
.
"Hotkey IfWin"가 스크립트에서 사용되지 않으면, 최근에 사용한 #IfWin 지시어가 (있다면) 그 Hotkey 명령어에 대하여 영향을 미칩니다.
마우스나 키보드 핫키가 IfWin에 의하여 꺼질 때, 자신의 고유 함수를 수행합니다; 즉, 마치 그런 핫키가 전혀 없는 것처럼 활성창까지 건네집니다. 한 가지 예외가 있습니다: 조이스틱 핫키는 예외입니다: IfWin이 작동하더라도, 버튼을 누르는 것을 다른 프로그램이 보지 못하도록 막지 않습니다.
변형 (중복) 핫키
특정 핫키는 각 정의마다 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
와 같습니다. 그렇지만, 키는 일관성있게 철자를 써야 합니다. 예를 들어, Esc는 이런 목적으로 Escape와 같지 않습니다 (그렇지만 대소문자는 문제가 되지 않습니다). 마지막으로, 와일드카드 접두 심볼 (*)을 가진 핫키는 모두 비-와일드카드 핫키와 완전히 다릅니다; 예를 들어, *F1
과 F1
는 각각 자신의 변형을 가집니다.
IfWin 핫키에 관한 더 자세한 정보는 #IfWin의 총평을 참조하십시오.
관련 항목
핫키 심볼, #IfWinActive/Exist, #MaxThreadsBuffer, #MaxThreadsPerHotkey, Suspend, IsLabel(), Threads, Thread, Critical, Gosub, Return, Menu, SetTimer
예제
Hotkey, ^!z, MyLabel return MyLabel: MsgBox You pressed %A_ThisHotkey%. return ; 기타 예제들: Hotkey, RCtrl & RShift, AltTab ; RCtrl & RShift를 Alt-Tab 처럼 작동하도록 만듭니다. Hotkey, #c, On ; Win-C 핫키를 재활성화합니다. Hotkey, $+#c, Off ; Shift-Win-C 핫키를 끕니다. Hotkey, ^!a, , T5 ; 핫키가 다섯 개의 쓰레드를 허용하도록 바꿉니다. Hotkey, IfWinActive, ahk_class Notepad Hotkey, ^!c, MyLabelForNotepad ; 노트패드에서만 작동하는 핫키로 Ctrl-Alt-C를 생성합니다..