관리 메뉴

ㄴrㅎnㅂrㄹrㄱi

OnMessage() GUI윈도우에 특정의 메세지가 보내졌을 때에 실행되는 함수를 할당한다 본문

AUTOHOTKEY/레퍼런스

OnMessage() GUI윈도우에 특정의 메세지가 보내졌을 때에 실행되는 함수를 할당한다

님투 2007. 11. 5. 14:56
반응형

OnMessage()

GUI윈도우에 특정의 메세지가 보내졌을 때에 실행되는 함수를 할당한다

OnMessage(MsgNumber [, "FunctionName", MaxThreads])

Parameters


인수명 설명
MsgNumber 감시·응답시키고 싶은 메세지의 번호
FunctionName 메세지를 받아들였을 때에 실행시키고 싶은 함수의 함수명을 문자열로서 지정한다
하늘의 문자열을 지정하면,MsgNumber에 대한 함수의 할당을 해제한다.
제2인수 이후를 생략 하면, 할당의 변경은 행해지지 않는다.
MaxThreads 메세지를 받아들여 함수를 실행중에 같은 메세지가 보내졌을 때, 스렛드 세치기에 의해서 실행할 수 있는 수의 상한을 지정한다.
생략시는 「1」.
끼어들어지지 않았던 경우는, 후술의 조건에 의해서 뒷전으로 될까 무시된다.
세치기를 허락하면, 메세지 이벤트가 시계열순서에 처리되지 않게 되기 위해, 통상은 변경하지 않는다.

FunctionName그리고 지정하는 함수

FunctionName([wParam,lParam,msg,hwnd])
{
}

인수 설명
wParam 메세지와 함께 보내진다WPARAM파라미터의 값이0...4294967296의 정수치로 주어진다
lParam 메세지와 함께 보내진다LPARAM파라미터의 값이-2147483648...2147483647.의 정수치로 주어진다
msg 보내진 메세지의 번호가 주어진다
hwnd 메세지가 보내진 윈도우나 컨트롤의 윈도우 핸들이 주어진다

할당하는 함수는,4개의 인수를 받을 수 있다.
인수명은 자유롭게 적어 상관없다.
그 인수로 주어지는 정보가 필요없는 경우, 인수의 설정을 생략 해도 상관없다.

함수가 불려 갈 때 , 이하의 편입 변수에도 메세지를 받아들인 상황에 따른 값이 설정된다.
또, LastFoundWindow(은)는 메세지를 받아들인 윈도우(메세지가 컨트롤에 보내졌을 경우는, 그 친윈도우)(이)가 된다.

A_Gui
메세지를 받아들인 것이GUI윈도우나GUI윈도우상의 컨트롤이었던 경우,GUI윈도우의 번호가 격납된다.
AutoHotkey의 메인 윈도우 등, 그 이외의 윈도우였던 경우는 공문자열이 된다.
A_GuiControl
메세지를 받아들인 것이GUI윈도우상의 컨트롤이었던 경우, 그 컨트롤에 할당할 수 있었던 변수명(없으면 컨트롤의 텍스트)하지만 격납된다.
그 이외의 경우, 하늘의 문자열이 된다.
A_GuiX
A_GuiY
메세지가PostMessage에 의해서 보내졌을 경우, 각각 메세지가 보내졌을 때의 마우스 커서의 횡좌표와 종좌표가 격납된다.
메세지가SendMessage에 의해서 보내졌을 경우,-2147483648(이)가 된다.
A_EventInfo
메세지가PostMessage에 의해서 보내졌을 경우, 메세지가 보내진 시간이OS기동시부터의 경과 밀리 세컨드수로 격납된다.
이 값은, A_TickCount(와)과 비교해 사용할 수 있다.
메세지가SendMessage에 의해서 보내졌을 경우,0(이)가 된다.

함수는Return문장으로-2147483648(으)로부터4294967295까지의 값을 돌려줄 수 있다.
값을 돌려주었을 경우, 메세지에의 응답은 거기서 완료한다.
함수가 돌려주어야 할 값은, 메세지의 종류에 따라서 다르다.
아무것도 값을 돌려주지 않았던 경우,AutoHotkey의 통상의 처리를 한다.

돌아가 값

문제 없게 할당을 하면, 그것까지MsgNumber에 할당할 수 있고 있던 함수의 함수명이 돌려주어진다.
다만, 그것까지 아무것도 할당할 수 있지 않았던 경우, 새롭게 할당한 함수명 자체가 돌려주어진다.
지정된 함수가 존재하지 않거나, 설정된 인수가 잘못되어 있는 경우 등, 정상적으로 할당을 실시할 수 없었던 경우는, 공문자열이 돌려주어진다.
FunctionName(을)를 주지 않았던 경우, 현재 할당할 수 있고 있는 함수명이 돌려주어진다.이 경우, 함수를 할당할 수 있지 않으면, 공문자열이 돌려주어진다.


Remarks

메세지 이벤트에 의한 함수의 실행은, 현재 실행중의 스렛드에 끼어들고, 신규 스렛드로서 실행된다.

AutoHotkey의 스크립트가 메뉴를 표시중이나, KeyDelay(이)나 MouseDelay의 도중등에서 정지하고 있는 동안에 보내졌을 경우,
0x312차례 미만의 메세지에 할당할 수 있었던 이벤트는 무시된다.
0x312차례 이상의 메세지의 경우는, 뒷전으로 된다.

이벤트가 무시되었을 경우, 할당할 수 있었던 함수는 실행되지 않고, 통상의 메세지 응답을 한다.
이벤트가 뒷전으로 되었을 경우, 스크립트가 실행 가능하게 된 시점에서 실행된다.

MsgBox커멘드등에서 다이얼로그가 표시되고 있는 동안은, 윈도우상의 컨트롤에 대한 메세지는 무시된다.

같은 번호의 메세지 이벤트가 실행중이었던 경우,MaxThreads의 상한을 넘지 않으면, 실행중의 스렛드에 끼어들어 메세지 이벤트가 실행된다.
메세지가0x312차례 이상으로, 실행중의 스렛드가 Critical상태였던 경우, 메세지 이벤트는 뒷전으로 된다
그 이외의 경우, 메세지 이벤트는 무시된다.

다른 메세지 이벤트인가, 메세지 이벤트 이외의 스렛드가 실행중에서, 스렛드가Critical상태이거나,Thread,Interrupt의 설정에 의한 세치기 금지 기간이었던 경우,
0x0~0x311차례의 메세지는 예외적으로 끼어들어진다.
0x312차례 이상의 메세지는 뒷전으로 된다.

메세지 응답 이벤트의 우선도는 항상0이기 위해, 실행중의 스렛드의 우선도가0보다 큰 경우, 모든 메세지는 무시된다.

0x0~0x311차례의 메세지 이벤트가 무시되지 않고 실행되듯이 하기 위해서는, 다음에 메세지가 체크되기 전에 메세지 이벤트가 종료하도록 하면 좋다.
짧은 처리의 경우는, 「Critical,30」(와)과 같이 해 메세지 체크 간격을 충분히 넓게 하면, 스렛드가 종료할 때까지 메세지가 체크되지 않고, 무시되는 일도 없어진다.
처리가 긴 경우는, 이하와 같이 하고, 다른0x312차례 이상의 메세지 이벤트를 호출해, 원의 스렛드는 즉석에서 종료하면 좋다.

MSG=0x000	;처리를 할당하고 싶은 메세지
OnMessage(MSG,"OnMSG")
OnMSG(w,l,m,h){
	PostMessage,0x4000,%w%,%l%,,ahk_id %h%
}
OnMessage(0x4000,"OnMSGMain")
OnMSGMain(w,l,m,h){
	Critical	;같은 메세지가 오면 뒷전으로 되도록(듯이) 한다
	/*
		여기서 시간이 걸리는 처리를 실행
		처리중에MSG차례의 메세지가 오면, 세치기로 이벤트가 발생해,
		0x4000차례의 메세지가 재발송신 되어 그 이벤트가 뒷전으로 실행된다
	*/
}

MsgNumber그리고 함수를 할당할 수 있는 메세지의 수는, 최대로500까지이다.
그 이상의 메세지에 응답하려고 하면, 이 함수는 실패한다.

OnMessage(을)를 사용하고 있는 스크립트는, 자동적으로 상주 상태한편 #SingleInstance(복수 실행 불가)(이)가 된다.

자작 프로그램끼리로 독자적인 메세지를 교환하고 싶은 경우는,Windows에 미리 정의된 메세지나AutoHotkey하지만 사용하는 메세지와 겹치지 않게0x1000(4096)차례 이후의 메세지 번호를 사용하는 것이 좋다.

GUI(을)를 가지지 않는다AutoHotkey의 스크립트에 메세지를 보내고 싶은 경우는,AutoHotkey의 메인 윈도우(ahk_class AutoHotkey)에 보내면 좋다.

일반적인 메세지의 일람에 대해서는, WinAPI Database for VB Programmer의 알파벳순서 표시 「W」의 항등이 자세하다.


Related

RegisterCallback(), OnExit, OnClipboardChange, Post/SendMessage, Functions, List of Windows Messages, DllCall(), Threads

Examples

; Example: Have a script receive a custom message from some other script or program.

OnMessage(0x5555, "MsgMonitor")
OnMessage(0x5556, "MsgMonitor")

MsgMonitor(wParam, lParam, msg)
{
	; Since returning quickly is often important, it is better to use a ToolTip than
	; something like MsgBox that would prevent the function from finishing:
	ToolTip Message %msg% arrived:`nWPARAM: %wParam%`nLPARAM: %lParam%
}

; The following could be used inside some other script to run the function inside the above script:
SetTitleMatchMode 2
DetectHiddenWindows On
ReceivingScript := WinExist("Name of Receiving Script.ahk ahk_class AutoHotkey")
if ReceivingScript
	PostMessage, 0x5555, 11, 22  ; Sends to the " last found window" due to WinExist() above.
DetectHiddenWindows Off  ; Must not be turned off until after PostMessage.

; Example: The following is a working script that monitors mouse clicks in a GUI window.
; See also:  GuiContextMenu

Gui, Add, Text,, Click anywhere in this window.
Gui, Add, Edit, w200 vMyEdit
Gui, Show
OnMessage(0x201, "WM_LBUTTONDOWN")
return

WM_LBUTTONDOWN(wParam, lParam)
{
	X := lParam & 0xFFFF
	Y := lParam >> 16
	if A_GuiControl
		Control := "`n(in control " . A_GuiControl . ")"
	ToolTip You left-clicked in Gui window #%A_Gui% at client coordinates %X%x%Y%.%Control%
}

GuiClose:
ExitApp

반응형
Comments