프날 오토핫키 강좌  v2

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

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

49. 비활성 키보드 입력 ControlSend


이번엔 비활성 창으로 키보드 입력을 전달하는 ControlSend를 배워보겠습니다. 이 역시 다른 창에 신호를 보내는 함수이기 때문에 모든 경우에서 동작을 보장하진 않지만, ControlClick 보다는 훨씬 안정적으로 동작합니다.

ControlSend

ControlClick은 어떤 창이나 컨트롤에 키 입력 신호를 보내줍니다. Send를 비활성 상태의 창에 사용하는 꼴입니다.

ControlSend(Keys [, Control, WinTitle, WinText, ExcludeTitle, ExcludeText])
ControlSend 함수의 원형

매개변수

  • Keys: 누를 키. (Send의 그것과 같음.)
  • Control: 키 입력 신호를 보낼 컨트롤
  • WinTitle: 키 입력 신호를 보낼 창의 Title 혹은 기타 식별자
  • WinText: 키 입력 신호를 보낼 창의 전체 혹은 일부 Text
  • ExcludeTitle: 이 곳에 적은 문자열이 포함된 Title을 가진 창은 제외하고 지정
  • ExcludeText: 이 곳에 적은 문자열이 포함된 Text를 가진 창은 제외하고 지정

ControlClick보다 쉽죠? 게다가 어디서 한번씩 본 매개변수입니다.

1. Keys

보낼 키입니다. Send와 마찬가지로 단일 키를 보낼 수도, 키 조합을 보낼 수도, 문장을 입력할 수 있습니다. 용법도 동일합니다. 입력할 키는 중괄호로 감싸고, 조합키를 나타내는 수식 기호를 앞에 붙여서 키 조합을 나타낼 수 있습니다.

^!+#는 키 조합을 보낼 때 사용하는 수식 기호이며, {}는 단일 자판을 입력할 때 쓰이는 기호였습니다. 만약 이들과 같이, 특별한 의미를 갖는 기호를 그대로 입력하려면 어떻게 해야할까요? 같은 상황에서 SendSendText로 바꿔준 것과 마찬가지로, ControlSendControlSendText로 바꿔 사용해주면 됩니다.

2. Control, WinTitle, WinText

키 입력 신호를 보낼 컨트롤과 창을 지정해줍니다. 'Control'에는 ClassNN을 적어주면 되고, 'WinTitle'에는 창의 Title이나 식별자를 적어줍니다. 마지막으로 'WinText'에는 창의 Text 일부를 적어주면 됩니다.

ControlClick과 마찬가지로 ClassNN을 적는 자리엔 컨트롤의 Text를 적어줄 수 있으며, 'WinTitle'에는 Title 대신 '프로세스명'과 같은 식별자를 이용하여 창을 구분지어줄 수도 있습니다. '프로세스명'을 지정해주려면 ahk_exe 수식어를 앞에 붙여 써주면 된다고 했죠.

다만, Text를 이용하여 창이나 컨트롤을 구분지어주는 경우는 거의 없습니다. 따라서 주로 Control 매개변수에는 ClassNN을 적으며, WinText 매개변수는 비워줍니다.

3. ExcludeTitle, ExcludeText

이곳에 적은 문자열을 포함한 Title/Text를 가진 창은 고려하지 않도록 합니다. ControlClick과 마찬가지입니다. 거의 사용되지 않습니다.

실습

1. ControlSend로 에디트 컨트롤에 입력하기

48강 실습에서 사용한 실습용 프로그램을 그대로 사용합니다.

에디트 컨트롤은 사용자가 입력할 수 있는 아래와 같은 컨트롤을 의미합니다.

실습용 프로그램에 입력 가능하며 Edit라고 사전에 입력되어있는 컨트롤에 붉게 네모 표시를 한 모습 사진 1. 에디트 컨트롤의 모습 (붉은 색)

실습용 프로그램에서 창과 에디트 컨트롤의 정보를 Window Spy를 통해 가져와봅시다. 제목은 'Test Program', 컨트롤의 ClassNN은 'Edit1'이네요. 한번 이 컨트롤에 "Type it"를 입력해보겠습니다.

1ControlSend("Type it", "Edit1", "Test Program")
예제 1. 실습 프로그램의 에디트에 글을 입력

스크립트를 실행하면 아래와 같이 에디트에 글이 입력됩니다. 이미 Edit라는 글이 입력되어 있었으므로, 전체 글은 EditType it이 된 것을 볼 수 있습니다.

에디트 컨트롤의 내용이 EditType it 이라고 적혀있는 모습 사진 1. 'Type it'이 입력된 모습

만약 사전에 입력된 글씨가 선택되어있었을 경우, EditType it이 아닌 Type it만 나타납니다. 우리가 글씨를 드래그하여 선택한 후 키보드를 입력하면 선택한 글씨가 지워진 후 입력되죠? 이와 같습니다.

2. 컨트롤이 아닌, 창에 직접 입력하기

만약, 특정 컨트롤이 아니라 창에 직접 키 입력 신호를 보내야 하는 경우는 어떻게해야할까요? 예를 들어서 컨트롤의 위가 아니라서 ClassNN이 나타나지 않거나, 아무 곳으로 키 입력을 해도 상관 없는 경우 말입니다. 바로 Control 매개변수를 생략하면 됩니다.

실습용 프로그램은 창에 직접 F5신호가 들어가면 알림 상자가 출력됩니다. 핫키(F5::)로 구현한 것이 아니기 때문에 여러분이 직접 눌러서는 출력되지 않습니다. 한번 F5 신호를 창으로 전송해보겠습니다.

1ControlSend("{F5}",, "Test Program")
예제 2. 실습 프로그램의 창에 직접 신호를 전달

어느 컨트롤도 지정해주지 않았으므로, 창에 직접 키 입력 신호를 보내어 알림 상자가 출력될 것입니다.

Tip: 컨트롤 함수

이외에도 'Control'로 시작하는 함수는 엄청나게 많으며, 컨트롤의 정보를 가져오거나, 제어하는 등 상상할 수 있는 웬만한 기능이 모두 지원됩니다. 이 모두를 강좌에서 설명드리기는 무리인 것 같고, 공식 문서의 'Control Functions' 문서를 참고하시길 바랍니다.

https://www.autohotkey.com/docs/v2/commands/Control.htm

질문하러 가기