PostMessage / SendMessage Tutorial by Rajat

This page explains how to send messages to a window or its controls via PostMessage or SendMessage and will answer some questions like:

필수 조건: [AutoHotkey v1.0.09+] and Winspector Spy (can be found here)

첫 예제로서, WinMenuSelectItem가 아웃룩 익스프레스의 "New Message" 창의 메뉴 바와 작동하는 데 실패한다는 사실을 주목하십시오; 다시 말해, 다음 코드는 작동하지 않습니다:

WinMenuSelectItem, New Message,, &Insert, &Picture...

그러나 PostMessage가 그 일을 해 줄 수 있습니다:

PostMessage, 0x0111, 40239, 0, , New Message

마법처럼 작동합니다! 그러나 도데체 이것은 무엇인가? 0x0111는 wm_command 메시지의 십육진 코드이고 40239는 이 특정한 창이 메뉴 항목 'Insert Picture' 선택으로 이해하는 코드입니다. 이제 어떻게 40239와 같은 값을 찾는지 알려 드리겠습니다:

  1. Winspector Spy를 열고 "New Message" 창을 엽니다.
  2. 십자가 표식을 Winspector Spy 창으로부터 "New Message" 창의 타이틀바로 끕니다 (Winspector Spy에 덮히지 않는 부분으로 끄십시오).
  3. 왼쪽에 있는 리스트에서 선택된 창을 우클릭하고 'Messages'를 선택합니다.
  4. 빈 창에 우클릭하고 'Edit message filter'를 선택합니다.
  5. 'filter all' 버튼을 클릭한 다음 왼쪽 리스트에서 'wm_command'를 더블클릭합니다. 이런 식으로 하면 오직 이 메시지만 관제할 수 있습니다.
  6. 이제 "New Message" 창으로 가서 메뉴 바로부터 선택합니다: Insert > Picture.
  7. 다시 Winspector Spy로 돌아와 신호등 버튼을 눌러 관제를 정지합니다.
  8. 그 동안 축적된 wm_command 메시지들을 확대합니다 (다른 것은 있더라도 무시합니다).
  9. (보통) 보고 싶은 것은 코드 0 메시지입니다. 종종 wm_command 메시지에 'win activated' or 'win destroyed' 기타 등등이 있을 수 있는데.. 필요하지 않습니다. 'Control ID: 40239'라고 말해주는 메시지를 발견했다면 ...바로 그것입니다!
  10. 이제 그것을 위의 명령어에 배치하면 완성입니다! 그것이 바로 wParam 값입니다.

다음 예제로 페인트 프로그램을 택하겠습니다. 왜냐하면 누구나가 있을 것이기 때문입니다. 이제 어플이 하나 있는데 오토핫키를 사용하여 툴바로부터 툴을 하나 선택해야 한다고 가정해 보겠습니다.

다음은 무엇을 할 것인가? 대부분은 아마도 툴바 버튼에 마우스 클릭을 예상할 겁니다. 그러나 툴바는 이동하고 숨을 수 있습니다! 페인트 툴바도 마찬가지입니다. 그래서 해당 사용자가 이렇게 구성해 두었다면, 스크립트는 그 시점에 바로 실패합니다. 그러나 다음 명령어는 여전히 작동합니다:

PostMessage, 0x0111, 639,,, Untitled - Paint

PostMessage의 또다른 장점은 창이 배경에 있을 수 있다는 것입니다; 대조적으로, 마우스 클릭은 창이 활성화되어 있기를 요구합니다.

다음에 몇 가지 예를 더 보여드리겠습니다. 주의: 필자는 WinXP Pro (SP1)을 사용합니다 ... 다른 OS를 사용한다면 매개변수가 다를 수 있습니다 (윈도우즈에 따라 오는 Wordpad 그리고 Notepad에만 적용할 수 있습니다; 다른 것은 매개변수가 다르지 않을 것입니다):

;Wordpad 에 군청색 쓰기를 설정합니다
PostMessage, 0x0111, 32788, 0, , Document - WordPad
;Notepad의 관하여 상자를 엽니다
PostMessage, 0x0111, 65, 0, , Untitled - Notepad
;Notepad에 워드랩을 토글합니다
PostMessage, 0x0111, 32, 0, , Untitled - Notepad
;미디어 플레이어를 연주/정지합니다
PostMessage, 0x0111, 32808, 0, , Windows Media Player
;실행 중인 AHK 스크립트의 핫키들을 보류합니다
DetectHiddenWindows, On
SetTitleMatchMode, 2
; Use 65306 to Pause and 65303 to Reload instead of Suspend. (see FAQ)
PostMessage, 0x0111, 65305,,, MyScript.ahk - AutoHotkey
; Press CapsLock and Numpad2 to reload all AutoHotkey scripts
CapsLock & Numpad2::
ReloadAllAhkScripts() {
    DetectHiddenWindows, On
    SetTitleMatchMode, 2
    WinGet, allAhkExe, List, ahk_class AutoHotkey
    Loop, % allAhkExe {
        hwnd := allAhkExe%A_Index%
        if (hwnd = A_ScriptHwnd)  ; ignore the current window for reloading
        {
            continue
        }
        PostMessage, 0x0111, 65303,,, % "ahk_id" . hwnd
    }
    Reload
}

위는 PostMessage용이었습니다. SendMessage도 똑같이 작동하지만 추가로 반환 값을 기다립니다. 이 값을 사용하면 Winamp에서 현재 연주 중인 트랙을 얻을 수 있습니다 (예제는 Winamp 자동화하기를 참조하십시오).

다음에 몇 가지 더 주의 사항이 있습니다:

주의: 이 테크닉으로도 작동하지 않는 어플이 있습니다. VB 어플과 Delphi 어플에서 그런 경우를 만났습니다. 이 테크닉은 C, C++ 어플에 사용하는 것이 제일 좋습니다. VB 어플은 같은 명령어인데도 'LParam'이 실행할 때마다 끊임없이 변합니다. Delphi 어플은 GUI가 전혀 wm_command를 사용하지 않기도 합니다. 아마도 마우스의 위치와 클릭을 사용하는 듯 보입니다.

오토핫키 포럼에 가셔서 탐험해 보고 여러분의 경험을 공유하십시오. 피드백은 언제나 환영합니다!

이 자습서는 초보자를 위한 것이 아닙니다 (기분 나쁘게 할 의도는 없습니다). 왜냐하면 이 명령어들은 고급 특징으로 간주되기 때문입니다. 그래서 위의 글을 읽어 본 후에 잘 모르겠다면, 그냥 잊어 버리십시오.

-Rajat