프날 오토핫키 강좌  v2

⚠ 이 강좌는 오토핫키 v2를 다룹니다

지금 보시는 강좌는 과거 오랜 시간동안 알려진 오토핫키(v1.1)의 차세대 버전인 오토핫키 v2를 다루고 있습니다.
만약 구버전인 '오토핫키 v1.1'의 강좌를 찾으신다면 프날 오토핫키 강좌(https://pnal.kr)를 봐주시면 되지만, 새로 오토핫키를 배우신다면 v2 버전을 배우시는 것을 강력히 추천드립니다.

48. 비활성 마우스 입력 ControlClick


활성 상태가 아닌 창에도 키보드 혹은 마우스 입력 신호를 창으로 전송하는 비활성 입력을 본격적으로 배워봅시다.

ControlClick

ControlClick은 어떤 창이나 컨트롤에 마우스 클릭 신호를 전송해줍니다. 우리가 배웠던 MouseClick을 비활성 상태의 창에 사용하는 꼴입니다. 마우스 커서가 실제로 움직이지 않고도 창에 마우스 클릭 신호를 전송할 수 있죠.

ControlClick([Control-or-Pos, WinTitle, WinText, WhichButton, ClickCount, Options, ExcludeTitle, ExcludeText])
ControlClick 함수의 원형

매개변수

  • Control-or-Pos: 클릭 신호를 보낼 컨트롤 혹은 위치(좌표)
  • WinTitle: 클릭 신호를 보낼 창의 제목 혹은 기타 식별자
  • WinText: 클릭 신호를 보낼 창의 전체 혹은 일부 내용
  • WhichButton: 클릭 신호를 보낼 버튼의 종류
  • ClickCount: 클릭 신호를 보낼 횟수
  • Options: 수행 방법을 지정할 수 있음
  • ExcludeTitle: 이 곳에 적은 문자열이 포함된 제목을 가진 창은 제외하고 지정
  • ExcludeText: 이 곳에 적은 문자열이 포함된 내용을 가진 창은 제외하고 지정

매개변수가 많지만 그렇게 어렵진 않으실 것입니다. 필요 없는 매개변수의 경우 생략하시면 됩니다.

1. Control-or-Pos

클릭할 컨트롤이나 좌표를 지정해줍니다. 컨트롤의 ClassNN을 적어주거나, 원하는 좌표를 Xn Yn형식으로 적어주시면 됩니다. 컨트롤을 클릭할 땐 해당 컨트롤의 중앙부를 클릭하게 되며, 좌표를 입력하면 그 창의 클라이언트 위치를 기준으로 적어준 좌표를 클릭하게 됩니다.

컨트롤은 내용으로도 지정할 수 있지만, 보통 그렇게 사용하지는 않습니다.

2. WinTitle

클릭 신호를 보낼 창의 제목이나 식별자를 적어줍니다. '식별자'는 프로세스명, 프로세스 ID, 윈도우 클래스, HWND 등을 적을 수 있는데, 앞에 어떤 식별자를 사용할 지 수식어를 적어준 후 사용할 수 있습니다. 가장 자주 쓰이는 식별자인 '프로세스명'은 ahk_exe라는 수식어를 쓴 후 적어주면 됩니다.

예를 들어서, 창의 제목이 "메모장"이며 프로세스명이 "notepad.exe"인 프로그램의 (100, 200)좌표에 클릭 신호를 보내려면 아래와 같은 두 가지 방법으로 사용할 수 있습니다.

1ControlClick("X100 Y100", "메모장")
1ControlClick("X100 Y100", "ahk_exe notepad.exe")
제목 '메모장' 또는 프로세스명 'notepad.exe'으로 클릭 신호를 보낼 창을 지정한 모습

ControlClick은 선택 매개변수만으로 이루어진 함수이지만, Control-or-Pos와 WinTitle 매개변수까지는 거의 필수로 작성해줍니다. 여기까지만 작성해도 올바른 위치에 클릭 신호를 보낼 수 있기 때문입니다.

3. WinText

클릭 신호를 보낼 창을 내용으로 구분하여 지정할 수 있습니다. 보통 사용되지 않습니다. WinTitle 만으로 충분히 창을 구별할 수 있기 때문입니다.

4. WhichButton, ClickCount

MouseClick과 사용법이 같습니다.

5. Options

ControlClick의 동작 방식을 설정할 수 있습니다. 아래와 같은 옵션 키워드를 띄어쓰기로 구분하여 적어줄 수 있습니다.

옵션역할
NA작업 중에 마우스를 사용하면 스크립트와 간섭될 수 있는데, 그럴 때 이 옵션을 적어볼 수 있습니다.
D마우스 "누름" 신호만 전달합니다. 즉, 클릭 후 떼지 않습니다.
U마우스 "뗌" 신호만 전달합니다.
Pos만약 컨트롤의 ClassNN이 Xn Yn 형태일 때, 좌표가 아닌 ClassNN으로 해석하도록 합니다.
Xn Yn컨트롤에 클릭 신호를 주었을 때, 해당 컨트롤의 어느 부분을 클릭할지 정해줍니다.

특히 'NA' 옵션은 마우스 클릭 신호가 전달될 때 창이 활성화 되는 증상을 막기 때문에, 마우스를 사용할 때 생기는 간섭을 방지하는 효과가 있습니다. 다만 일부 상황에선 'NA' 옵션을 사용할 시 오히려 동작하지 않는 경우도 있기 때문에 필요한 경우에만 사용해줍니다.

6. ExcludeTitle, ExcludeText

이곳에 적은 문자열을 포함한 제목/내용를 가진 창은 고려하지 않도록 합니다. 예를 들어서, 똑같은 제목을 가진 두 창이 있지만 하나의 창만 "Needle"이라는 내용을 가지고 있다고 할 때, 다른 창을 지정하여 클릭 신호를 보내려면 ExcludeText에 Needle을 적어줌으로서 해당 창은 고려하지 않게 할 수 있습니다.

실습

사전 준비 - 실습용 프로그램 내려받기

아래와 같은 실습용 프로그램을 준비하였으니, 다운로드 해주시길 바랍니다. 스크립트 파일(.ahk)로 제공하여 프로그램의 코드를 볼 수 있으므로 안심하고 내려받으셔도 됩니다.

실습용 프로그램
Sample.ahk (2.6KB)

프로그램을 실행하면 아래와 같은 창이 뜨며, 버튼을 눌렀을 때 알림 상자가 뜨는 것을 제외하곤 각 컨트롤을 조작해도 아무 반응이 없습니다. 오토핫키로 간단히 만든 프로그램인데, 여러분도 강좌를 끝까지 보면 비슷하게 구현할 수 있습니다.

버튼, 입력 상자, 체크 박스와 라디오 버튼, 각기 다른 형태의 목록형 선택 상자와 슬라이더가 있는 실습용 프로그램의 모습 사진 1. 실습용 프로그램의 모습

1. ControlClick으로 버튼 클릭하기

클릭 신호를 보낼 창과 컨트롤의 정보를 가져와보는 것이 첫 단계입니다. Window Spy를 이용하여 실습 프로그램의 'Button'이라고 적힌 버튼 컨트롤의 정보를 가져와봅시다.

마우스 커서를 정보를 가져올 컨트롤에 올린 후, Window Title, Class and Process 박스 아래에 Test Program이라고 적혀있고, Control Under Mouse Position 박스 아래에 ClassNN: Button1 이라고 적혀있는 Window spy의 모습 사진 2. 신호를 보낼 창과 버튼 컨트롤의 정보

창의 제목은 'Test Program'이고, 버튼의 ClassNN은 'Button1'입니다. 이를 이용하여 ControlClick 함수를 구성할 수 있습니다.

1ControlClick("Button1", "Test Program")
예제 1. 실습 프로그램의 버튼을 클릭하는 코드

스크립트를 실행하면 마우스 커서가 움직이지 않고도 실습 프로그램의 버튼을 눌러 버튼이 클릭되었습니다.가 출력될 것입니다.

2. ControlClick으로 체크 박스 및 라디오 버튼 클릭하기

비슷한 예로, 실습용 프로그램의 체크 박스와 라디오 버튼을 클릭해보겠습니다. 'CheckBox'라고 적힌 네모 모양 선택지는 '체크 박스'이고, 'Radio'라고 적힌 동그란 선택지는 '라디오 버튼'입니다.

이번엔 '두 번째 체크 박스'와 '세 번째 라디오 버튼'을 각각 클릭하는 예제를 만들어보겠습니다. Window Spy로 각각의 ClassNN을 가져와보면 'Button3', 'Button6'일 것입니다.

1ControlClick("Button3", "Test Program")
2ControlClick("Button6", "Test Program")
예제 2. 실습 프로그램의 체크 박스와 라디오 버튼을 클릭하는 코드

정상적으로 수행이 되었다면 아래와 같이 두 컨트롤의 상태가 변화하는 것을 볼 수 있습니다.

체크 박스는 아무데도 체크가 되어있지 않고, 라디오 버튼은 Radio1에 체크되어있는 모습 체크 박스는 두 번째 체크 박스에 체크가 되어있지 않고, 라디오 버튼은 Radio3에 체크되어있는 모습
사진 3~4. 프로그램 실행 전(좌)와 프로그램 실행 후(우)

3. ControlClick으로 좌표 클릭해보기

지금까지 Control-or-Pos 매개변수로 ClassNN를 사용하는 실습을 해보았습니다. 이번엔 클릭 신호를 보낼 좌표를 지정하여 사용해보겠습니다.

지금까지 사용했던 실습용 프로그램은 좌표로 클릭하는 것을 연습하기엔 적절하지 않은 것 같군요. 컨트롤이 명확히 구분되어있어서 ClassNN으로 원하는 지역을 정확히 선택할 수 있었습니다. 그래서 우리는 Windows에 내장되어있는 '그림판' 프로그램을 이용하여 실습해보겠습니다.

1Loop 10
2 ControlClick("X" A_index * 10 + 400 " Y400", "제목 없음 - 그림판",,,, "NA")
예제 3. 그림판에 점 10개를 찍는 프로그램

코드를 보고 결과를 생각해보세요. 첫 번째 매개변수가 "X" A_index * 10 + 400 " Y400"로 쓰였는데, X Y400은 문자열로 작성하였고 나머지는 연산하여 넣어주었습니다. X좌표가 A_index * 10 + 400인 셈이죠. 반복할 때마다 A_index의 값이 증가하니 x좌표는 반복될 때마다 410, 420, 430... 을 클릭할 것입니다.

결과적으로 해당 매개변수의 값은 (X410 Y400) (X420 Y400)... 처럼 구성되는 것을 볼 수 있습니다. 아래와 같이 죽 늘여서 쓰는 것보다 반복문을 사용한 것이 훨씬 효율적임은 당연하죠.

1ControlClick("X410 Y400", "제목 없음 - 그림판",,,, "NA")
2ControlClick("X420 Y400", "제목 없음 - 그림판",,,, "NA")
3ControlClick("X430 Y400", "제목 없음 - 그림판",,,, "NA")
~...(중략)
10ControlClick("X500 Y400", "제목 없음 - 그림판",,,, "NA")

만약 '브러시' 도구의 두께를 최대로 놓고 스크립트를 실행하면 아래와 같은 결과가 나옵니다.

그림판에 점 10개가 찍힌 모습 사진 5. 비활성 입력으로 10군데 클릭

그 외에 특기할만한 내용은 ①제어문의 내용이 한 줄이기에 블록을 생략해주었다는 점NA 옵션을 사용해주었다는 점, ③중간의 매개변수가 대부분 생략되어 쉼표가 여러 번 찍혀있는 모습이 되었다는 점입니다. 따라서 그림판이 활성화 상태로 바뀌지 않고도, 위 사진과 같이 10개의 점이 찍히는 것을 볼 수 있습니다.

조금 어려웠나요? 그래도 이번 강을 완전히 이해하셨다면 다음 강인 ControlSend는 훨씬 쉽게 할 수 있을 것입니다. 앞서 45강의 '코드의 당연한 성질에 대하여'에서 말씀드렸던 것처럼 다른 창과 상호작용하는 코드는 원하는 동작이 되지 않을 수 있습니다. 모든 프로그램이 다르게 만들어졌기 때문입니다. 따라서 코드가 정확하더라도 작동하지 않을 수 있습니다. 실제 프로그램을 작성할 땐 여러 시행착오를 겪어야하며, 아예 다른 함수를 써야할 수도 있는 점 알아두시면 되겠습니다.

질문하러 가기