⚠ 이 강좌는 오토핫키 v2를 다룹니다
지금 보시는 강좌는 과거 오랜 시간동안 알려진 오토핫키(v1.1)의 차세대 버전인 오토핫키 v2를 다루고 있습니다.
만약 구버전인 '오토핫키 v1.1'의 강좌를 찾으신다면 프날 오토핫키 강좌(https://pnal.kr)를 봐주시면 되지만,
새로 오토핫키를 배우신다면 v2 버전을 배우시는 것을 강력히 추천드립니다.
77. 창 존재 및 활성 여부 확인
마지막 수정일: 2023-12-17
이번엔 특정 창이 존재하는지, 또 존재한다면 활성화 되어있는지 알아볼 수 있는 함수를 배워보겠습니다.
WinExist
WinExist
는 창이 존재하는지 확인하고, 존재한다면 해당 창의 고유 ID(HWND)를 반환하며 그렇지 않다면 0을 반환합니다.
WinExist([WinTitle, WinText, ExcludeTitle, ExcludeText])
WinExist 함수의 원형
인수는 지금까지 써주었던 것처럼 창을 특정하는데 쓰이고, 역시 대부분의 경우 WinTitle만 써줍니다.
대신 WinTitle 앞에 ahk_exe
수식어를 붙여서 창의 제목 대신 프로세스명을 이용하여 창을 특정지을 수 있다고 했습니다.
한가지 더 배워보겠습니다. WinTitle 앞에 ahk_id
수식어가 붙으면 창의 제목 대신 고유 ID인 'HWND'를 이용할 수 있습니다.
예를 들어서 "ahk_id " myWindow
라는 값을 WinTitle 매개변수로 전달하면, myWindow 변수에 담긴 HWND 값을 이용해서 창을 지정할 수 있습니다.
(문자열 ahk_id 뒤에 한 칸의 공백이 있다는 것에 유의하세요. 이렇게 해야만 myWindow 변수가 값(숫자)으로 치환됐을 때 "ahk_id 000000"와 같은 형태가 만들어집니다.)
다만 HWND를 가져오는 가장 일반적인 방법이 WinExist
이기 때문에 WinExist
의 WinTitle 매개변수엔 ahk_id
수식어를 쓸 일이 없겠네요.
Tip: HWND?
HWND는 Handle to Window의 약자로, 그냥 '윈도우 핸들'이라고도 하고, 혼동될 일이 없으면 그냥 'id'라고도 합니다. 각 창을 구별하여 조작(Handling)하는데 쓰이기 때문에 이런 이름이 붙었습니다.
향후 프로그래밍을 하거나 IT/SW 쪽에 관심을 가지시면 "핸들" 혹은 "핸들값"이라는 말을 많이 들으실텐데, 이는 그 값이 고유하거나 사실상 고유(99.9999...% 확률로 겹치지 않음)하여 여러 개체간에 구별이 되는 값이라고 생각하시면 됩니다.
오토핫키 프로그래밍을 할 때에도, 각 창을 단순히 제목(Title)으로만 구별짓지 말고 대상 창의 HWND를 WinExist()
로 구하여 그 값을 코드에 이용하는 것이 바람직합니다.
프로그램 실행 중 제목이 같은 다른 창이 있어도 원래 목표했던 창을 정확히 지정할 수 있으니까요!
WinActive
WinActive
는 창이 활성 상태인지 확인하고, 만약 그렇다면 HWND를 반환하며 그렇지 않다면 0을 반환합니다.
WinActive([WinTitle, WinText, ExcludeTitle, ExcludeText])
WinActive 함수의 원형
지난 강에서 배웠던 WinActivate
와 헷갈리지 마세요!
WinActive
는 창의 활성 상태 여부를 가져오는 함수, WinActivate
는 창을 활성 상태로 만들어주는 함수입니다.
매개변수와 반환값은 WinExist
와 같으니 설명하지 않겠습니다.
WinTitle 인수로 [A]
이제 중요하고 자주 쓰이는 테크닉을 하나 설명드리겠습니다.
제가 지금까지 설명드린 모든 WinTitle 매개변수엔 문자열 A
를 인수로 제공할 수 있습니다.
A
는 '현재 활성 창'을 의미하는 특별한 인수입니다.
따라서, 아래 코드는 현재 활성되어있는 창의 HWND를 가져와 targetId 변수에 담습니다.
... targetId := WinExist("A")
실습
이번 강도 마찬가지로 실습이 없습니다. 다만 위의 함수를 이용하여 특정 창의 HWND를 가져와서 출력해보는 연습을 해보세요.
다음 강에선 미처 살펴보지 못한 다른 창 함수를 간략하게 훑어보고, 그 다음 강에서 프로그래밍 문제를 통해 이 함수들을 이용해보겠습니다.