#IfWinActive / #IfWinExist
문맥-감지 핫키와 핫스트링을 만듭니다. 그런 핫키는 활성화 된 또는 존재하는 창의 종류에 따라 다른 조치를 수행합니다 (또는 아무일도 하지 않습니다).
#IfWinActive [, WinTitle, WinText] #IfWinExist [, WinTitle, WinText] #IfWinNotActive [, WinTitle, WinText] #IfWinNotExist [, WinTitle, WinText] #If [, Expression]
매개변수
- WinTitle
목표 창을 식별하는 창 제목 또는 다른 기준. WinTitle 참조.
부합하는 행위는 자동-실행 섹션에 설정된 대로SetTitleMatchMode가 결정합니다.
대부분의 다른 지시어처럼, 변수는 지원하지 않습니다. ahk_pid와 ahk_id를 하드-코드된 프로세스나 창 ID와 함께 사용할 수는 있지만, 더 일반적인 것은 #IfWin이 간접적으로 GroupAdd나 Hotkey IfWin을 통하여 사용하는 것입니다.
- WinText
존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (동봉된 Window Spy 유틸리티에 노출됨). 숨은 텍스트는 DetectHiddenText이 자동-실행 섹션 (스크립트이 최상단)에 켜져 있으면 탐지됩니다.
- ExcludeTitle
ExcludeText 이것들은 지원되지 않지만, WinTitle대하여
ahk_group MyGroup
를 지정하면 간접적으로 사용할 수 있습니다 (여기에서 MyGroup은 GroupAdd를 통하여 생성된 그룹이며, 이 그룹은 ExcludeTitle/Text를 지원합니다).
기본 연산
#IfWin 지시어로 문맥 감지 핫키와 핫스트링을 쉽게 만들 수 있습니다. 예를 들어:
#IfWinActive ahk_class Notepad #space::MsgBox 노트패드 안에서 Win+Spacebar를 눌렀습니다.
#IfWin 지시어는 위치에 민감합니다: 스크립트에서 물리적으로 아래에 있는 모든 핫키와 핫스트링에 영향을 미칩니다. 이 둘은 또 상호 배타적입니다; 즉, 가장 최신의 것만 효과가 있습니다.
문맥 감지를 끄려면, 매개변수 없이 #IfWin 지시어를 지정하십시오. 예를 들어:
#IfWinActive
#IfWin이 꺼져 있을 때 (또는 스크립트에 전혀 사용되지 않으며), 모든 핫키와 핫스트링이 모든 창에 대하여 활성화 됩니다 (Suspend나 Hotkey 명령어를 통하여 끌 수 있습니다).
마우스나 키보드 핫키가 #IfWin를 통하여 꺼져 있을 때, 고유의 기능을 수행합니다; 즉, 마치 그런 핫키가 전혀 없는 것처럼 활성 창에 건네집니다. 한 가지 예외가 있습니다: 조이스틱 핫키는: #IfWin이 작동하더라도, 다른 프로그램이 버튼 누름을 보는 것을 막지 않습니다.
#IfWin는 또 정상 키의 행위를 마치 엔터키나 스페이스 키처럼 바꾸는 데에도 사용할 수 있습니다. 이는 특정 창이 그 키를 무시하거나 마음에 안드는 행위를 수행할 경우 유용합니다. 예를 들어:
#IfWinActive Reminders ahk_class #32770 ; 아웃룩의 "알리미" 창. Enter::Send !o ; "Enter" 키눌림은 선택된 알리미를 재우는게 아니라 열리도록 만듭니다. #IfWinActive
변종 (중복) 핫키
특정 핫키나 핫스트링은 각 정의마다 #IfWin 기준이 다르다면 스크립트에 한 번 이상 정의할 수 있습니다. 이것을 핫키 변종이라고 합니다. 예를 들어:
#IfWinActive ahk_class Notepad ^!c::MsgBox 노트패드에서 Control+Alt+C를 눌렀습니다. #IfWinActive ahk_class WordPadClass ^!c::MsgBox 워드패드에서 Control+Alt+C를 눌렀습니다. #IfWinActive ^!c::MsgBox 노트패드/워드패드가 아닌 창에서 Control+Alt+C를 눌렀습니다.
여러 변종이 촉발될 수 있다면, 스크립트에서 제일 위쪽에 있는 변종만 촉발됩니다. 예외가 있다면 전역 변종입니다 (#IfWin 기준이 전혀 없다면): 언제나 가장 우선 순위가 낮습니다. 그러므로, 경쟁 상대로 다른 변종이 전혀 없을 경우에만 촉발됩니다 (이 예외는 핫스트링에 적용되지 않습니다).
중복 핫키를 만들 때, ^!+#와 같은 수식 심볼의 순서는 문제가 되지 않습니다. 예를 들어, ^!c
는 !^c
와 동일합니다. 그렇지만, 키는 일관성이 있게 철자가 되어야 합니다. 예를 들어, 이런 목적으로 Esc는 Escape와 같지 않습니다 (그렇지만 대소문자는 문제가 되지 않습니다). 또, 와일드카드 접두 심볼(*)이 있는 핫키는 완전히 비-와일드카드 핫키와 구분됩니다; 예를 들어, *F1
와 F1
는 각자 자신만의 변종 집합이 있습니다.
같은 핫키 서브루틴을 여러 변종이 실행하도록 만들려면, 가장 쉬운 방법은 동일한 핫키를 주욱 늘어놓고, 각각 #IfWin 지시어를 다르게 만드는 것입니다. 예를 들어:
#IfWinActive ahk_class Notepad #z:: #IfWinActive ahk_class WordPadClass #z:: MsgBox 노트패드 또는 워드패드에서 Win+Z를 눌렀습니다. return
대안으로, #IfWinActive ahk_group MyGroup
을 통하여 창 그룹을 사용할 수 있습니다.
핫키 변종을 (스크립트가 실행중인 동안에) 동적으로 생성하려면, "Hotkey IfWin"를 참조하십시오.
총평
#IfWin는 또 적절할 때 접두 키를 자신의 고유 기능으로 복구합니다 (접두 키는 "a & b"와 같이 핫키 안에 있는 "a" 키입니다). 주어진 접두 심볼에 대하여 활성화된 핫키가 전혀 없을 때마다 이런 일이 일어납니다.
Gosub나 Goto를 사용하여 핫키나 핫스트링 라벨에 점프할 때, 스크립트 상단에 가까운 변종으로 점프합니다.
핫키가 현재 #IfWin을 통하여 꺼져 있으면, 그의 키나 마우스 버튼은 "#" 문자와 함께 KeyHistory의 "Type" 컬럼에 나타납니다. 이는 스크립트 디버깅에 도움이 됩니다.
%Var%와 같은 변수 참조는 현재 지원하지 않습니다. 그러므로, 퍼센트 사인은 `%를 통하여 피신시켜야 합니다. 앞으로는 지원할 가능성이 있습니다. 비슷하게, (`,를 통하여) 글자 그대로의 쉼표도 피신시켜야 합니다. 추가 매개변수가 미래에 추가될 가능성이 있습니다. 이 한계를 우회할 필요가 있다면, GroupAdd와 ahk_group를 사용하십시오.
Hotkey 명령어가 핫키에 할당한 라벨은 #IfWin에 직접적으로 영향을 받지는 않습니다. 대신에, #IfWin를 스크립트 상단에 가깝게 사용하면 Hotkey 명령어가 생성한 모든 핫키에 영향을 줍니다 (단 "Hotkey IfWin"가 사용되어 그것을 바꾸지 않았어야 합니다).
알트-탭 핫키는 #IfWin에 영향을 받지 않습니다: 오히려 모든 창에 효과가 있습니다.
마지막 발견 창은이 #IfWinActive/Exist이 설정합니다 (그렇지만 #IfWinNotActive/NotExist로는 설정되지 않습니다). 예를 들어:
#IfWinExist ahk_class Notepad #n::WinActivate ; #IfWin이 발견한 창을 활성화합니다.
#IfWin의 매개변수 중 하나에 선두 또는 후미의 스페이스/탭이 필요하면, 피신 연속열 `s와 `t를 사용할 수 있습니다.
수행성능의 이유로, #IfWin는 지정된 창의 존재나 활성화를 항상 관제하지는 않습니다. 대신에, 핫키나 핫스트링을 타자할 때만 부합하는 창이 있는지 점검합니다. 부합하는 창이 존재하지 않으면, 키눌림이나 마우스 클릭은 활성 창 안으로 그대로 통과시킵니다.
창 제목과 텍스트는 대소문자를 구분합니다. 숨은 창은 DetectHiddenWindows이 (스크립트 상단) 자동 실행 섹션에서 켜졌다면 탐지됩니다 .
관련 항목
#If 표현식, Hotkey 명령어, Hotkeys, Hotstrings, Suspend, IfWinActive, IfWinExist, SetTitleMatchMode, DetectHiddenWindows
예제
#IfWinActive ahk_class Notepad ^!a::MsgBox 노트패드가 활성화되어 있는 동안 Ctrl-Alt-A를 눌렀습니다. ; 이 핫키는 다른 창에 눌려봐야 아무 효과도 없습니다 (그대로 "통과 시킵니다"). #c::MsgBox 노트패드가 활성화되어 있는 동안 Win-C를 눌렀습니다. ::btw:노트패드에 있는 동안에만 :"btw"에 대하여 이 텍스트로 교체됩니다. #IfWinActive #c::MsgBox 노트패드가 아닌 창에서 Win-C를 눌렀습니다.