PostMessage / SendMessage

메시지를 창이나 콘트롤에 보냅니다 (SendMessage는 승인을 기다립니다).

PostMessage, Msg , wParam, lParam, Control, WinTitle, WinText, ExcludeTitle, ExcludeText
SendMessage, Msg , wParam, lParam, Control, WinTitle, WinText, ExcludeTitle, ExcludeText, Timeout

매개변수

Msg

전송할 메시지 번호, 표현식가능. 숫자를 알아 내려면 메시지 목록을 참조하십시오.

wParam

메시지의 첫 번째 구성요소. 표현식 가능. 비어 있거나 생략하면 0이 전송됩니다.

lParam

메시지의 두 번째 구성요소. 표현식 가능. 비어 있거나 생략하면 0이 전송됩니다.

Control

이 매개변수가 비어있거나 생략되면, 메시지는 그의 콘트롤 중에 하나가 아니라 직접 목표 창에 전송됩니다. 그렇지 않으면, 이 매개변수는 ClassNN (클래스이름과 콘트롤의 실체 번호) 또는 콘트롤의 텍스트일 수 있습니다. 둘 모두 Window Spy로 알아낼 수 있습니다. 텍스트를 사용할 때, 부합하는 행위는 SetTitleMatchMode로 결정됩니다.

콘트롤의 HWND (창 핸들)에 작동시키려면, Control 매개변수를 빈 채로 두고 ahk_id %ControlHwnd%WinTitle 매개변수에 지정하십시오 (이것은 숨은 창에도 작동합니다. DetectHiddenWindows가 꺼져 있어도 상관 없습니다). 콘트롤의 HWND는 전형적으로 ControlGet Hwnd, MouseGetPos, 또는 DllCall()을 통하여 열람됩니다.

WinTitle

목표 창을 식별하는 창 제목 또는 다른 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (동봉된 Window Spy 유틸리티에 노출됨). 숨은 텍스트는 DetectHiddenText가 켜져 있어야 탐지됩니다.

ExcludeTitle

제목에 이 값이 있는 창은 무시합니다.

ExcludeText

텍스트에 이 값이 있는 창은 무시합니다.

Timeout

[AHK_L 42+]: 목표 창이 메시지를 처리하기를 기다릴 밀리초의 최대 개수. 생략하면 기본값은 5000 (밀리초)입니다. 이 값은 이 매개변수를 지원하지 않았던 예전 버전의 AutoHotkey에서 기본값입니다. 메시지가 이 시간 안에 처리되지 않으면, 명령어는 끝나고 ErrorLevel에 단어 FAIL을 설정합니다. 이 매개변수는 표현식일 수 있습니다.

ErrorLevel

[v1.1.04+]: 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

PostMessage: ErrorLevel은 문제가 있었으면 1이 설정됩니다. 예를 들어 목표 창이나 콘트롤이 존재하지 않을 경우에 1이 설정됩니다. 그렇지 않으면 0이 설정됩니다.

SendMessage: ErrorLevel은 문제가 있었거나 시간제한에 걸리면 단어 FAIL이 설정됩니다. 그렇지 않으면, 메시지의 숫자 값 결과가 설정됩니다. 가끔 이 값이 메시지와 그의 목표 창의 성질에 따라 "reply"일 경우가 있습니다.

가능한 값의 범위는 오토핫키의 버전과 목표 창에 따라 다릅니다. 32-비트 버전의 오토핫키를 사용하거나, 또는 목표 창이 32-비트이면, 그 결과는 0부터 4294967295 까지의 32-비트 무부호 정수입니다. 64-비트 버전의 오토핫키를 64-비트 창에 사용하면, 그 결과는 -9223372036854775808과 9223372036854775807 까지의 64-비트 부호있는 정수입니다 .

결과가 32-비트 부호 있는 정수이기를 원한다면 (-2147483648부터 2147483648까지의 값), 다음과 같이 32-비트로 잘라내고 부호있는 값으로 변환할 수 있습니다:

MsgReply := ErrorLevel << 32 >> 32

이 변환은 AutoHotkey 64-비트에서도 필요할 수가 있습니다. 왜냐하면, 32-비트 창으로부터의 결과는 확장되지 않기 때문입니다. 예를 들어, 32-비트 창으로부터의 결과가 -1이면 어느 오토핫키 버전에서도 0xFFFFFFFF으로 보입니다. 반면에 64-비트 창으로부터의 결과가 -1이면 32비트 버전의 오토핫키에서는 0xFFFFFFFF으로 보이고 64비트 버전에서는 -1로 보입니다.

논평

이 명령어들은 주의해서 사용해야 합니다. 왜냐하면 엉뚱한 창에 메시지를 전송하면 (또는 무효한 메시지를 전송하면) 예상치 못한 행위를 야기하게 되고 심지어 목표 어플리케이션이 충돌을 일으킬 수 있기 때문입니다. 대부분의 어플리케이션은 외부 소스로부터 어떤 유형의 메시지를 받도록 설계되어 있지 않습니다.

PostMessage는 메시지를 목표 창에 연관된 메시지 큐에 넣습니다. 승인이나 응답을 기다리지 않습니다. 대조적으로, SendMessage는 목표 창이 그 메시지를 처리하기를 시간제한에 걸릴 때까지 기다립니다.

wParamlParam 매개변수는 정수여야 합니다. AutoHotkey 또는 목표 창이 32-비트이면, 오직 아래의 32 비트만 사용됩니다; 즉, 값은 범위가 -2147483648과 4294967295 (0xFFFFFFFF) 사이입니다. 오토핫키와 목표 창이 모두 64-비트이면, 오토핫키가 지원하는 어떤 정수도 사용할 수 있습니다. 오토핫키의 모든 정수 값처럼, 접두사가 0x이면 십육진수를 나타냅니다. 예를 들어 0xFF는 255와 동등합니다.

문자열은 변수의 주소를 지정하면 wParam 또는 lParam을 통하여 전송할 수 있습니다. 다음 예제는 주소 연산자 (&)를 사용해 전송합니다:

SendMessage, 0x000C, 0, &MyVar, ClassNN, WinTitle  ; 0x000C은 WM_SETTEXT입니다

[v1.0.43.06+]: 메시지 수신자에 의하여 MyVar 안에 배정된 문자열은 별도의 추가 절차 없이 적절하게 인지됩니다. 그렇지만, 이것은 매개변수의 첫 문자가 앰퍼센드 (&)일 경우에만 작동합니다; 예를 들어, 5+&MyVar는 작동하지 않지만 &MyVar 또는 &MyVar+5는 작동합니다.

인용부호 처리된/기호 그대로의 문자열도 다음 예제와 같이 전송할 수 있습니다 (& 연산자는 이 경우 사용하면 안 됩니다):

#Persistent
ListVars
WinWaitActive, ahk_class AutoHotkey
SendMessage, 0x000C, 0, "New Title"  ; 0x000C은 WM_SETTEXT입니다

메시지 하나를 숨어 있든 비활성화되어 있든 시스템에 있는 모든 창에 보내려면, ahk_id 0xFFFFWinTitle (0xFFFF는 HWND_BROADCAST임)에 지정하십시오. 이 테크닉은 다음 예제와 같이 방송용 의도의 메시지에만 사용해야 합니다:

SendMessage, 0x001A,,,, ahk_id 0xFFFF  ; 0x001A은 WM_SETTINGCHANGE입니다

스크립트가 메시지를 받도록 하려면 OnMessage()를 사용하십시오.

이 명령어드들을 사용하는 방법에 관한 소개는 메시지 자습서를 참조하십시오.

창 제목과 텍스트는 대소문자를 구분합니다. 숨은 창은 DetectHiddenWindows가 켜져 있어야 탐지됩니다.

Message List, Message Tutorial, OnMessage(), Automating Winamp, DllCall(), ControlSend, WinMenuSelectItem

예제

Press a hotkey to turn off the monitor.

#o:: ; Win+O
Sleep 1000  ; 사용자에게 키를 뗄 기회를 줍니다 (키를 떼면 모니터가 다시 깹니다).
; Turn Monitor Off:
SendMessage, 0x0112, 0xF170, 2,, Program Manager  ; 0x0112는 WM_SYSCOMMAND이고, 0xF170는 SC_MONITORPOWER입니다.
; 위에 주목하십시오: 2 대신에 -1을 사용하면 모니터가 켜집니다.
; 2 대신에 1을 사용하면 모니터의 저전력 모드가 켜집니다.
return

사용자가 선택한 화면 보호기를 시작합니다.

SendMessage, 0x0112, 0xF140, 0,, Program Manager  ; 0x0112는 WM_SYSCOMMAND이고, 0xF140는 SC_SCREENSAVE입니다.

한 줄 위로 감습니다 (수직 스크롤 바가 있는 콘트롤에 대하여).

ControlGetFocus, control, A
SendMessage, 0x0115, 0, 0, %control%, A

한 줄 아래로 감습니다 (수직 스크롤 바가 있는 콘트롤에 대하여).

ControlGetFocus, control, A
SendMessage, 0x0115, 1, 0, %control%, A

활성 창의 키보드 레이아웃/언어를 영어로 전환합니다.

PostMessage, 0x0050, 0, 0x4090409,, A  ; 0x0050은 WM_INPUTLANGCHANGEREQUEST입니다.

Winamp에게 현재 활성화되어 있는 트랙 번호를 물어봅니다 (더 자세한 정보는 Winamp 자동화 하기를 참조하십시오).

SetTitleMatchMode, 2
SendMessage, 0x0400, 0, 120,, - Winamp
if (ErrorLevel != "FAIL")
{
    ErrorLevel++  ; Winamp의 카운트는 "0"에서 시작합니다. 그래서 1로 조정합니다.
    MsgBox, #%ErrorLevel% 번 트랙이 현재 연주 중입니다.
}

Finds the process ID of an AHK script (an alternative to WinGet PID).

SetTitleMatchMode, 2
DetectHiddenWindows, On
SendMessage, 0x0044, 0x405, 0, , SomeOtherScript.ahk - AutoHotkey v
MsgBox %ErrorLevel% is the process id.