WinTitle 매개변수와 마지막으로 찾은 창
WinTitle 매개변수와 마지막으로 찾은 창 (WinTitle Parameter & Last Found Window)
AutoHotkey 창 함수가 대상 창을 식별하는 데 쓰는 WinTitle 매개변수와 각 ahk_ 기준, 그리고 마지막으로 찾은 창(last found window)을 설명하는 문서예요.
출처: 문서
본문
목차 (Table of Contents)
- 창 제목과 일치 동작 (Window Title & Matching Behaviour)
- A (활성 창, Active Window)
- ahk_class (창 클래스)
- ahk_id (고유 ID / HWND)
- ahk_pid (프로세스 ID)
- ahk_exe (프로세스 이름/경로)
- ahk_group (창 그룹)
- 여러 기준 (Multiple Criteria)
- 마지막으로 찾은 창 (Last Found Window)
- 관련 항목 (Related)
창 제목과 일치 동작 (Window Title & Matching Behaviour)
어떤 문자열이든 WinTitle로 지정해서 제목으로 창을 식별해요. 창의 제목은 종종 창 위쪽 타이틀 바의 텍스트로 보여요. 보이지 않거나 부분적으로만 보이면, WinGetTitle이나 Window Spy로 전체 창 제목을 알아낼 수 있어요.
다음 예시는 계산기를 활성화해요:
WinActivate "Calculator"
SetTitleMatchMode는 부분적이거나 완전한 제목을 각 창의 제목과 어떻게 비교하는지 제어해요. 설정에 따라 WinTitle은 정확한 제목이거나, 접두사, 제목 어디에나 나타나는 부분 문자열, 또는 RegEx 패턴을 담을 수 있어요. 이 설정은 ahk_class와 ahk_exe 기준이 RegEx 패턴으로 해석될지도 제어해요.
창 제목은 대소문자를 구분해요. 단, RegEx 패턴에서 i) 수정자를 사용할 때는 예외예요.
숨겨진 창은 DetectHiddenWindows가 켜져 있을 때만 감지돼요. 단, WinShow는 항상 숨겨진 창을 감지해요.
여러 창이 WinTitle과 다른 기준에 일치하면, 최상위 일치 창이 사용돼요. 활성 창이 기준에 일치하면 보통 다른 모든 창 위에 있으므로 우선하게 돼요. 하지만 항상 위에 있는(always-on-top) 창도 일치한다면(그리고 활성 창이 항상 위에 있는 것이 아니라면), 그것이 대신 사용될 수 있어요.
[v2.0.6+]에서 지정된 창 제목, ahk_class 기준 값, ahk_exe 기준 값의 처음 1023자만 일치에 고려되는 것은 더 이상 사실이 아니에요. 길이를 초과해도 더 이상 예상치 못한 결과로 이어지지 않으며, 이는 드물게 발생하지만 아주 긴 RegEx 패턴을 사용하면 더 자주 만날 수 있어요.
A (활성 창, Active Window)
WinTitle에 문자 A를 사용하고 다른 세 개의 창 매개변수(WinText, ExcludeTitle, ExcludeText)를 생략해서 활성 창을 대상으로 해요.
다음 예시는 활성 창의 고유 ID(HWND)를 검색해서 보고해요:
MsgBox WinExist("A")
다음 예시는 누르면 활성 창을 최대화하는 핫키를 만들어요:
#Up::WinMaximize "A" *; Win+Up*
ahk_ 기준 (ahk_ Criteria)
다음 ahk_ 기준 중 하나 이상을(선택적으로 창 제목에 더해) 지정하고, 각각을 정확히 하나의 공백이나 탭으로 다음 것과 구분해요(다른 공백이나 탭은 이전 기준의 리터럴 부분으로 취급돼요). ahk_ 기준은 항상 ahk_ 키워드와 그 기준 값으로 구성되며, 0개 이상의 공백이나 탭으로 구분돼요. 예를 들어, ahk_class Notepad는 메모장 창을 식별해요.
ahk_ 키워드와 그 기준 값은 공백이나 탭으로 구분할 필요가 없어요. 이것은 주로 ahk_ 기준을 변수와 함께 지정할 때 유용해요. 예를 들어, "ahk_pid" PID 대신 "ahk_pid " PID로 지정할 수 있어요. 하지만 다른 모든 경우에는 가독성을 위해 적어도 하나의 공백이나 탭을 구분으로 사용하는 것이 좋아요.
ahk_class (창 클래스)
WinTitle에 ahk_class ClassName을 사용해 창 클래스로 창을 식별해요.
창 클래스는 시스템이 창을 만들 때 템플릿으로 사용하는 속성 집합이에요. 즉, 창의 클래스 이름이 어떤 *유형(type)*의 창인지 식별해요. 창 클래스는 Window Spy로 알아내거나 WinGetClass로 검색할 수 있어요. RegEx 제목 일치 모드가 활성 상태이면 ClassName은 정규식을 받아들여요.
창 클래스는 대소문자를 구분해요. 단, RegEx 패턴에서 i) 수정자를 사용할 때는 예외예요.
다음 예시는 콘솔 창(예: cmd.exe)을 활성화해요:
WinActivate "ahk_class ConsoleWindowClass"
다음 예시는 위와 동일하지만 정규식을 사용해요(동작하게 하려면 미리 RegEx 제목 일치 모드를 켜야 한다는 점에 주의):
WinActivate "ahk_class ^ConsoleWindowClass$"
ahk_id (고유 ID / HWND)
WinTitle에 ahk_id HWND 또는 순수 HWND(Integer 또는 Hwnd 프로퍼티를 가진 Object로)를 사용해 고유 ID로 창이나 컨트롤을 식별해요. 객체에 Hwnd 프로퍼티가 없거나 그 값이 정수가 아니면 PropertyError 또는 TypeError가 던져져요.
각 창과 컨트롤에는 HWND(창에 대한 핸들(handle to window)의 약어)라고도 알려진 고유 ID가 있어요. 이 ID는 제목이나 텍스트가 바뀌어도 창이나 컨트롤을 식별하는 데 사용할 수 있어요. 창의 ID는 보통 WinExist나 WinGetID로 검색되며 Window Spy로 알아낼 수 있어요. HWND로 컨트롤을 식별하는 자세한 내용은 Control Identifiers를 참조해요.
HWND는 PostMessage, SendMessage로 창이나 컨트롤에 메시지를 직접 보내거나, DllCall로 네이티브 API를 호출할 때 특히 유용해요.
ahk_id HWND를 사용할 때, DetectHiddenWindows는 숨겨진 최상위 창이 감지되는지에 영향을 주지만, 숨겨진 컨트롤은 항상 감지돼요. 순수 HWND를 사용할 때는 DetectHiddenWindows와 무관하게 숨겨진 창이 항상 감지돼요. WinWait와 WinWaitClose는 예외인데, ahk_id HWND와 순수 HWND 둘 다 DetectHiddenWindows의 영향을 받아요.
ahk_id HWND는 주어진 창이 일치해야 하는 다른 기준과 결합될 수도 있어요. 예를 들어, WinExist("ahk_id " ahwnd " ahk_class " aclass)는 창이(DetectHiddenWindows에 따라) "감지"되고 그 창 클래스가 aclass가 담은 문자열과 일치하면 ahwnd를 반환해요.
다음 예시들은 VarContainingID에 저장된 고유 ID로 창을 대상으로 해요:
*; Integer를 전달.*
WinActivate Integer(VarContainingID)
WinShow A_ScriptHwnd
WinWaitNotActive WinExist("A")
*; Hwnd 프로퍼티를 가진 Object를 전달.*
WinActivate {Hwnd: VarContainingID}
WinWaitClose myGuiObject
*; ahk_id 접두사 사용.*
WinActivate "ahk_id " VarContainingID
ahk_pid (프로세스 ID)
WinTitle에 ahk_pid PID를 사용해 특정 프로세스에 속한 창을 식별해요. 프로세스 식별자(PID)는 보통 WinGetPID, Run 또는 Process 함수로 검색돼요. 창의 프로세스 ID는 Window Spy로 알아낼 수 있어요.
다음 예시는 VarContainingPID에 저장된 프로세스 ID로 창을 활성화해요:
WinActivate "ahk_pid " VarContainingPID
ahk_exe (프로세스 이름/경로)
WinTitle에 ahk_exe ProcessNameOrPath를 사용해 주어진 이름이나 경로를 가진 프로세스에 속한 창을 식별해요.
ahk_pid 기준은 하나의 특정 프로세스로 제한되는 반면, ahk_exe 기준은 주어진 문자열과 일치하는 이름이나 전체 경로를 가진 모든 프로세스를 고려해요. RegEx 제목 일치 모드가 활성 상태이면 ProcessNameOrPath는 프로세스의 전체 경로와 일치해야 하는 정규식을 받아들여요. 그렇지 않으면 대소문자를 구분하지 않는 이름이나 전체 경로를 받아들이는데, 예를 들어 ahk_exe notepad.exe는 ahk_exe C:\Windows\Notepad.exe, ahk_exe C:\Windows\System32\Notepad.exe 및 다른 변형을 포함해요. 창의 프로세스 이름은 Window Spy로 알아낼 수 있어요.
다음 예시는 프로세스 이름으로 메모장 창을 활성화해요:
WinActivate "ahk_exe notepad.exe"
다음 예시는 위와 동일하지만 정규식을 사용해요(동작하게 하려면 미리 RegEx 제목 일치 모드를 켜야 한다는 점에 주의):
WinActivate "ahk_exe i)\notepad\.exe$" *; 전체 경로의 이름 부분과 일치.*
ahk_group (창 그룹)
WinTitle에 ahk_group GroupName을 사용해 이전에 정의된 창 그룹이 담은 규칙과 일치하는 창 또는 창들을 식별해요.
WinMinimize, WinMaximize, WinRestore, WinHide, WinShow, WinClose 및 WinKill은 그룹의 모든 창을 대상으로 해요. 반대로 WinActivate와 WinExist 같은 다른 창 함수들은 그룹의 최상위 창만을 대상으로 해요.
다음 예시는 창 그룹이 정의한 기준과 일치하는 어떤 창이든 활성화해요:
*; 그룹 정의: Windows Explorer 창들*
GroupAdd "Explorer", "ahk_class ExploreWClass" *; Vista 이상에서는 사용되지 않음*
GroupAdd "Explorer", "ahk_class CabinetWClass"
*; 위 기준과 일치하는 어떤 창이든 활성화*
WinActivate "ahk_group Explorer"
여러 기준 (Multiple Criteria)
검색을 넓히는 ahk_group 기준과 달리, WinTitle 매개변수 안에 둘 이상의 기준을 지정하면 검색을 좁힐 수 있어요. 다음 예시에서 스크립트는 제목에 My File.txt가 포함되고 클래스가 Notepad인 창을 기다려요:
WinWait "**My File.txt** ahk_class **Notepad**"
WinActivate *; 찾은 창을 활성화.*
이 방법을 사용할 때 제목의 텍스트(원한다면)를 먼저 나열하고, 그다음 하나 이상의 추가 기준을 나열해야 해요. 첫 번째 다음의 기준은 정확히 하나의 공백이나 탭으로 이전 것과 구분해야 해요(다른 공백이나 탭은 이전 기준의 리터럴 부분으로 취급돼요).
ahk_id 기준은 창의 제목, 클래스 또는 다른 속성을 테스트하기 위해 다른 기준과 결합될 수 있어요:
MouseGetPos ,, &id
if WinExist("ahk_class Notepad ahk_id " id)
MsgBox "The mouse is over Notepad."
마지막으로 찾은 창 (Last Found Window)
이것은 WinExist, WinActive, WinWait[Not]Active, WinWait 또는 WinWaitClose가 가장 최근에 찾은 창이에요. 대상 창의 WinTitle과 WinText를 모든 창 함수에 반복할 필요가 없으므로 스크립트를 더 쉽게 만들고 유지할 수 있어요. 또한 스크립트가 처음 찾은 후 대상 창을 다시 검색할 필요가 없으므로 성능도 더 좋아요.
마지막으로 찾은 창은 WinWait, WinActivateBottom, GroupAdd, WinGetCount 및 WinGetList를 제외한 모든 창 함수에서 사용될 수 있어요. 사용하려면 네 개의 창 매개변수(WinTitle, WinText, ExcludeTitle, ExcludeText)를 모두 생략하기만 하면 돼요.
각 스레드는 마지막으로 찾은 창의 자신만의 값을 보유해요. 즉, 현재 스레드가 다른 스레드에 방해받으면, 원래 스레드가 재개될 때 여전히 방해한 스레드의 것이 아니라 원래 마지막으로 찾은 창 값을 가져요.
마지막으로 찾은 창이 숨겨진 Gui 창이면, DetectHiddenWindows가 꺼져 있을 때에도 사용할 수 있어요. 이것은 자주 GUI의 +LastFound 옵션과 함께 사용돼요.
다음 예시는 메모장을 열고, 그것이 존재할 때까지 기다린 다음 활성화해요:
Run "Notepad"
WinWait "Untitled - Notepad"
WinActivate *; WinWait가 찾은 창 사용.*
다음 예시는 WinExist가 찾은 메모장 창을 활성화하고 최대화해요:
if WinExist("Untitled - Notepad")
{
WinActivate *; WinExist가 찾은 창 사용.*
WinMaximize *; 위와 동일.*
Send "Some text.{Enter}"
}
다음 예시는 WinExist가 찾은 계산기를 활성화하고 새 위치로 이동해요:
if not WinExist("Calculator")
{
*; ...*
}
else
{
WinActivate *; WinExist가 찾은 창 사용.*
WinMove 40, 40 *; 위와 동일.*
}
관련 항목 (Related)
ControlID Parameter (Window Control Identifiers)