프날 오토핫키 강좌
누르면 강좌 리스트가 나와요
프날 오토핫키 강좌

📣 더 깊은 내용이 담긴 '프날 오토핫키 강좌 v2'의 서적판이 공개되었습니다.

가장 최신의 오토핫키를 담은 '프날 오토핫키 강좌 v2'를 책으로 만나보세요! v2 페이지에 공개된 분량보다 더욱 깊은 내용을 처음이라도 괜찮아, 오토핫키 프로그래밍을 통해 배울 수 있습니다. 전국 온/오프라인 서점에서 만나요!
책 더 알아보기 및 구매하기 

[프날 오토핫키] OnMessage 사용하기

#질문답변

 

본 포스팅은 프날 오토핫키의 질문답변란에 올라온 질문을 해결하기 위해 올리는 추가 글입니다.

질문 내용

 

오토핫키에서 OnMessage()라는 함수를 사용하면 특정한 윈도우 메시지가 발생했을때 특정 함수를 실행하도록 만들 수 있습니다. "윈도우 메시지"란, 프로그램 창에서 무언가 변화가 생겼을 때, 그것을 알리는 역할을 합니다. 한마디로, "프로그램의 창의 크기가 변했다!"라는 메시지를 감지해서, 창의 크기가 변했을 때 특정 동작을 할 수 있도록 프로그래밍 할 수 있다는 것이지요.

 

OnMessage(메시지 코드, 메시지가 발생했을 때 실행할 함수명)

 

위와같이 사용하시면 됩니다.(간략하게 썼습니다.)

 

메시지 코드, 그러니까 감지할 수 있는 창의 변화에는 아래와 같은 것들이 있습니다.

 

List of Windows Messages | AutoHotkey

List of Windows Messages Below is a list of values for the Msg parameter of PostMessage and SendMessage. To discover more about how to use a particular message (e.g. WM_VSCROLL), look it up at http://msdn.microsoft.com or with a search engine of your choic

www.autohotkey.com

 

WM_으로 시작하는 메시지 명을 보고, 무엇을 감지하는지 유추할 수 있죠.

질문자님의 케이스에는 "마우스가 올라갔을 때"를 의미하므로, WM_MOUSEHOVER 메시지를 이용하면 되겠습니다. 메시지 코드는 0x02A1이네요. 이 메시지가 감지되면 "ImageHovered()" 라는 함수를 실행한다고 가정하겠습니다. 그렇다면 코드는 아래와 같게 되겠지요.

 

OnMessage(0x02A1, "ImageHovered")

이 명령줄이 실행되었다면, 오토핫키 프로그램은 프로그램 위에 마우스가 호버될때마다 ImageHovered()라는 함수를 실행할 것입니다.

 

그러나, WM_MOUSEHOVER 이벤트는 WM_NCMOUSEMOVE 이벤트 안에서 특정 함수를 실행한 뒤에야 비로소 사용할 수 있는 메시지로서, 초보자가 이해하기엔 난해한 부분이 없지않아 있습니다.

 

따라서, 우리는 "마우스가 움직일때"라는 메시지를 사용할 것입니다. 메시지 이름은 WM_MOUSEMOVE이고, 번호는 0x200입니다. 함수명도 그에 맞게 바꿔줬습니다.

OnMessage(0x200, "MouseMoved")

 


한편, OnMessage()에 의해 실행되는 함수는 wParam과 lParam 매개변수를 갖습니다(Msg와 Hwnd매개변수도 갖지만, 자주 사용되지 않으니 생략하겠습니다.) lParam의 l은 "엘"입니다. ("아이"가 아닙니다.)

 

메시지가 발생된 경우에 따라 wParam과 lParam에 값이 다르게 들어가는데, wParam값에는 보통 문자열이, lParam값에는 보통 숫자가 들어갑니다. 그런데 이번 질문을 해결하는데 이 두 매개변수도 필요없습니다. 따라서, MouseMoved() 함수는 아무 매개변수도 없는 함수로 만들어도 무방합니다.

 

MouseMoved()
{
    return
}

이제 이 함수 안에 "이미지를 교체하는" 동작을 구현하면 되겠습니다. 오토핫키는 GUI위에서 마우스가 이동될때마다 이 함수를 실행하기 때문에, "만약 마우스가 올려진 컨트롤이 Picture 컨트롤일 경우"라는 조건이 필요한데, A_GuiControl은 현재 마우스 아래에 있는 컨트롤을 가져올 수 있는 함수기 때문에 아래와 같이 구현이 가능합니다.

이미지에 g레이블이 없다면 A_GuiControl에 빈 값이 담기기 때문에 아무 동작도 하지 않는 g레이블을 달아주었습니다.

 

그리고 이미지 위에 마우스가 올라갔을 때 할 작업을 써주면 되겠지요. 질문자님 경우엔 "이미지 교체"입니다. GuiControl을 통해서 쉽게 가능하겠죠? (참고: GuiCotnrol 본편 강좌)

 

결국 위와같이 "Img1 위에 마우스가 올라갔으면 2.png로 컨트롤을 교체하고, Img1 밖에서 마우스가 움직이고 있다면 1.png로 교체" 라는 구문이 완성됩니다.

 

문제점이 있는데 보이시나요? 바로 마우스가 움직일때마다 해당 함수를 거치기 때문에, 이미지 위에서 커서를 움직이면 이미지가 깜빡이는 현상이 일어납니다.

 

그래서 현재 이미지가 어떤 상태인지 hovered 변수(플래그 변수) 하나를 추가해서, 만약 이미지가 이미 바뀐 상태라면 이미지를 다시 로딩하지 않도록 수정했습니다.

 

ImgBox로 변수명을 좀 바꿨습니다 ^^;

 

아무튼, 이런식으로 구현해놓고, 1.png를 좀 더 진한색으로 2.png를 좀 더 연한색으로 만들면, 이미지에 마우스를 갖다댈때마다 버튼에 마우스가 호버되는 것처럼 보일 수 있죠.

 

질문에 도움이 되셨길 바랍니다. (코드 연습을 위해서 사진으로 코드 제공해드린점 이해 부탁드려요. 코드는 쓰면 쓸수록 늡니다.)

 

 

 

⚠ 이 강좌는 오토핫키 v1을 다룹니다

지금 보시는 강좌는 구버전 오토핫키(v1.1)를 다루고 있습니다. 따라서 본 강좌의 내용은 현재 최신 오토핫키 버전 (v2.0)과 호환되지 않습니다. 구버전의 정보가 필요한 것이 아니라면, 가능한 한 새로운 사이트에 작성한 v2 강좌(https://ahkv2.pnal.dev)를 봐주시길 바랍니다.