#IfWinActive / #IfWinExist

문맥-감지 핫키핫스트링을 만듭니다. 그런 핫키는 활성화 된 또는 존재하는 창의 종류에 따라 다른 조치를 수행합니다 (또는 아무일도 하지 않습니다).

#IfWinActive [, WinTitle, WinText]
#IfWinExist [, WinTitle, WinText]
#IfWinNotActive [, WinTitle, WinText]
#IfWinNotExist [, WinTitle, WinText]
#If [, Expression]
선택

매개변수

WinTitle

목표 창을 식별하는 창 제목 또는 다른 기준. WinTitle 참조.

부합하는 행위는 자동-실행 섹션에 설정된 대로SetTitleMatchMode가 결정합니다.

대부분의 다른 지시어처럼, 변수는 지원하지 않습니다. ahk_pidahk_id를 하드-코드된 프로세스나 창 ID와 함께 사용할 수는 있지만, 더 일반적인 것은 #IfWin이 간접적으로 GroupAddHotkey IfWin을 통하여 사용하는 것입니다.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (동봉된 Window Spy 유틸리티에 노출됨). 숨은 텍스트는 DetectHiddenText이 자동-실행 섹션 (스크립트이 최상단)에 켜져 있으면 탐지됩니다.

ExcludeTitle
ExcludeText

이것들은 지원되지 않지만, WinTitle대하여 ahk_group MyGroup를 지정하면 간접적으로 사용할 수 있습니다 (여기에서 MyGroupGroupAdd를 통하여 생성된 그룹이며, 이 그룹은 ExcludeTitle/Text를 지원합니다).

기본 연산

#IfWin 지시어로 문맥 감지 핫키핫스트링을 쉽게 만들 수 있습니다. 예를 들어:

#IfWinActive ahk_class Notepad
#space::MsgBox 노트패드 안에서 Win+Spacebar를 눌렀습니다.
선택 | 내려받기

#IfWin 지시어는 위치에 민감합니다: 스크립트에서 물리적으로 아래에 있는 모든 핫키와 핫스트링에 영향을 미칩니다. 이 둘은 또 상호 배타적입니다; 즉, 가장 최신의 것만 효과가 있습니다.

문맥 감지를 끄려면, 매개변수 없이 #IfWin 지시어를 지정하십시오. 예를 들어:

#IfWinActive
선택 | 내려받기

#IfWin이 꺼져 있을 때 (또는 스크립트에 전혀 사용되지 않으며), 모든 핫키핫스트링이 모든 창에 대하여 활성화 됩니다 (SuspendHotkey 명령어를 통하여 끌 수 있습니다).

마우스나 키보드 핫키가 #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와 동일합니다. 그렇지만, 키는 일관성이 있게 철자가 되어야 합니다. 예를 들어, 이런 목적으로 EscEscape와 같지 않습니다 (그렇지만 대소문자는 문제가 되지 않습니다). 또, 와일드카드 접두 심볼(*)이 있는 핫키는 완전히 비-와일드카드 핫키와 구분됩니다; 예를 들어, *F1F1는 각자 자신만의 변종 집합이 있습니다.

같은 핫키 서브루틴을 여러 변종이 실행하도록 만들려면, 가장 쉬운 방법은 동일한 핫키를 주욱 늘어놓고, 각각 #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%와 같은 변수 참조는 현재 지원하지 않습니다. 그러므로, 퍼센트 사인은 `%를 통하여 피신시켜야 합니다. 앞으로는 지원할 가능성이 있습니다. 비슷하게, (`,를 통하여) 글자 그대로의 쉼표도 피신시켜야 합니다. 추가 매개변수가 미래에 추가될 가능성이 있습니다. 이 한계를 우회할 필요가 있다면, GroupAddahk_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를 눌렀습니다.
선택 | 내려받기