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와 같은 값을 찾는지 알려 드리겠습니다:
다음 예제로 페인트 프로그램을 택하겠습니다. 왜냐하면 누구나가 있을 것이기 때문입니다. 이제 어플이 하나 있는데 오토핫키를 사용하여 툴바로부터 툴을 하나 선택해야 한다고 가정해 보겠습니다.
다음은 무엇을 할 것인가? 대부분은 아마도 툴바 버튼에 마우스 클릭을 예상할 겁니다. 그러나 툴바는 이동하고 숨을 수 있습니다! 페인트 툴바도 마찬가지입니다. 그래서 해당 사용자가 이렇게 구성해 두었다면, 스크립트는 그 시점에 바로 실패합니다. 그러나 다음 명령어는 여전히 작동합니다:
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 자동화하기를 참조하십시오).
다음에 몇 가지 더 주의 사항이 있습니다:
SetTitleMatchMode, 2
DetectHiddenWindows, On
주의: 이 테크닉으로도 작동하지 않는 어플이 있습니다. VB 어플과 Delphi 어플에서 그런 경우를 만났습니다. 이 테크닉은 C, C++ 어플에 사용하는 것이 제일 좋습니다. VB 어플은 같은 명령어인데도 'LParam'이 실행할 때마다 끊임없이 변합니다. Delphi 어플은 GUI가 전혀 wm_command를 사용하지 않기도 합니다. 아마도 마우스의 위치와 클릭을 사용하는 듯 보입니다.
오토핫키 포럼에 가셔서 탐험해 보고 여러분의 경험을 공유하십시오. 피드백은 언제나 환영합니다!
이 자습서는 초보자를 위한 것이 아닙니다 (기분 나쁘게 할 의도는 없습니다). 왜냐하면 이 명령어들은 고급 특징으로 간주되기 때문입니다. 그래서 위의 글을 읽어 본 후에 잘 모르겠다면, 그냥 잊어 버리십시오.
-Rajat