프로그래밍

[AutoHotKey] PostMessage 함수를 이용한 키보드 모의

채윤아빠 2021. 12. 28. 22:59
728x90
반응형


AutoHotKey에서 키보드 에뮬레이션을 위한 Send 함수가 제공됩니다.

 

사용법도 매우 간단하고 쉽습니다.

WinActivate, *제목 없음

Send Hello AutoHotKey

위와 같이 스크립트를 작성하고 실행해 보면, 열린 메모장(notepad)을 활성화하고, "Hello AutoHotKey" 문장을 입력하게 됩니다.

 

하지만 사용하면서, 한 가지 아쉬운 점이 있었습니다. 다중 작업을 수행할 수 있는 운영체제에서 반드시 에뮬레이션 처리하려는 창이 활성화 되어 있어야만 원하는 형식으로 동작한다는 점입니다.
즉, 대상 창이 활성화 되지 않은 상태에서 Send 함수를 이용하면, 엉뚱한 창에 키보드 동작이 모의되어 의도하지 않았던 결과를 얻게 됩니다.

 

대상 창이 활성화되지 않은 상태에서도 키보드 동작을 모의하기 위하여 PostMessage 함수를 이용하면 됩니다.

PostMessage, Msg [, wParam, lParam, Control, WinTitle, WinText, ExcludeTitle, ExcludeText]

PostMessage는 위와 같은 형식으로 정의되어 있고, 메시지 값을 필수로 받고 나머지는 입력하지 않고 호출하여도 무방합니다.

 

ESC 키를 눌렀을 경우에는 다음과 같이 모의할 수 있습니다.

; escape 키 모의
PostMessage, 0x100, 0x1B, 0x00010001, Edit1, 제목 없음 ; 0x100 = WM_KEYDOWN ; 0x1B = VK_ESCAPE
PostMessage, 0x102, 0x1B, 0x00010001, Edit1, 제목 없음 ; 0X102 = WM_CHAR
PostMessage, 0x101, 0x1B, 0xC0010001, Edit1, 제목 없음 ; 0X101 = WM_KEYUP ; 0x1B = VK_ESCAPE

lParam 값이 좀 복잡하게 구성되어 있으나, 대 부분의 프로그램이 lParam을 상세하게 확인하지는 않습니다.

 

아래는 코드는 메모장을 대상으로 키보드 동작을 모의하는 예시입니다.

; notepad는 key down 으로 키보드 모의가 안됨
PostMessage, 0x100, 0x61, 0xC0000001, Edit1, *제목 없음 ; 0X100 = WM_DOWN ; a
PostMessage, 0x100, 0x62, 0xC0000001, Edit1, *제목 없음 ; 0X100 = WM_DOWN ; b
PostMessage, 0x100, 0x63, 0xC0000001, Edit1, *제목 없음 ; 0X100 = WM_DOWN ; c

PostMessage, 0x102, 0x41, 0x1, Edit1, *제목 없음 ; 0X102 = WM_CHAR ; A
PostMessage, 0x102, 0x42, 0x1, Edit1, *제목 없음 ; 0X102 = WM_CHAR ; B
PostMessage, 0x102, 0x43, 0x1, Edit1, *제목 없음 ; 0X102 = WM_CHAR ; C

PostMessage, 0x102, 0x61, 0x1, Edit1, *제목 없음 ; 0X102 = WM_UP ; a
PostMessage, 0x102, 0x62, 0x1, Edit1, *제목 없음 ; 0X102 = WM_UP ; b
PostMessage, 0x102, 0x63, 0x1, Edit1, *제목 없음 ; 0X102 = WM_UP ; c

메모장의 경우, WM_KEYDOWN 으로는 키보드 동작을 모의할 수 없고, WM_CHAR 또는 WM_KEYUP 메시지를 통하여 모의가 가능합니다.

 

프로그램 별로 키보드 메시지 처리 방식이 다르므로, 해당 프로그램에 직접 WM_DOWN, WM_CHAR, WM_KEYUP 등을 보내서 정상적으로 동작하는 경우를 찾아서 모의를 하도록 하면, 대상 창이 활성화되지 않은 상태에서도 키보드 동작을 모의할 수 있습니다.


참고자료