이번 칼럼에서는 LDPlayer의 윈도우가 활성/비활성 상태 일때도 마우스 클릭을 할 수 있는 방법에 대해서 알아봅니다.
목 차
MouseClick
오토핫키 언어에서는 마우스를 제어하기 위한 API 함수를 기본적으로 제공하고 있습니다. 마우스 클릭을 위한 MouseClick, 마우스 이동을 위한 MouseMove 등이 제공되고 있습니다. 하지만 이 API 함수들은 대상 윈도우가 다른 윈도우에 가려져 비활성 상태일때는 정상적으로 동작하기가 어렵습니다.
ControlSend
오토핫키에서는 이런 문제를 해결하기 위해 ControlSend라고 하는 API 함수를 제공합니다. 하지만 ControlSend 함수는 대상 윈도우의 활성/비활성 상태에 따라 동작이 잘 안되는 현상이 빈번하게 발생하는 문제가 있습니다. SetControlDelay, NA, DetectHiddenWindows 옵션을 윈도우 상태에 따라 적절하게 설정해주어야 합니다. 하지만 가끔 클릭이 먹통이 될 때가 있어 ControlSend는 일부 사용자들에게 불안정한 기능으로 인식되고 있습니다.
SendMessage
SendMessage 와 PostMessage 함수는 대상 윈도우에 직접 윈도우 메시지를 보내는 기능을 합니다. 여기서 윈도우 메시지란? 윈도우 이동, 윈도우 크기 조절, 마우스 왼쪽 버튼 누르기 등을 할 수 있는 메시지를 말합니다. SendMessage는 메시지를 전송 후에 수신받은 쪽에서 메시지가 정상적으로 처리가 완료 될때까지 대기하는 특성을 가지고 있습니다. 이로 인해 송신하는 쪽에서는 모든 작업이 멈추는 블럭(Block) 현상이 발생 할 수도 있습니다. 마우스 클릭과 같이 빠르게 동작해야 하는 메시지를 처리하기에는 부적절한 함수입니다.
PostMessage
PostMessage는 SendMessage와 다르게 윈도우 메시지를 송신 후에 수신자의 메시지 처리상태를 기다리지 않는 특성을 가지고 있습니다. 쉽게 말해서 대상 윈도우인 LDPlayer의 처리 상태와 무관하게 마우스 클릭 메시지를 빠르게 보낼 수 있습니다.
TAL_LDPostMouseClick
아래의 소스 코드는 LDPlayer 윈도우에 PostMessage 함수를 이용하여 마우스 클릭 메시지를 발생시키는 업자코연구소에서 제작한 라이브러리 함수 입니다.
;비활성 클릭
;LR : 왼쪽클릭(LEFT)/오른쪽클릭(RIGHT)
;X : X좌표
;Y : Y좌표
global TitleBarHeight = 35
TAL_LDPostMouseClick(WindowTitle="", LR, X, Y)
{
WinGet, hwndPlayer, ID, %WindowTitle%
Y -= TitleBarHeight
lparam := X | Y << 16
if (LR = "LEFT")
{
PostMessage, 0x201, 1, %lparam%, RenderWindow1, ahk_id %hwndPlayer%
randSleep(10, 0, 50)
PostMessage, 0x202, 0, %lparam%, RenderWindow1, ahk_id %hwndPlayer%
}
else if (LR = "RIGHT")
{
PostMessage, 0x204, 1, %lparam%, TheRender, ahk_id %hwndPlayer%
randSleep(10, 0, 50)
PostMessage, 0x205, 0, %lparam%, TheRender, ahk_id %hwndPlayer%
}
}
사용 예제
TAL_LDPostMouseClick 예제코드.zip
본 칼럼 내용에 대해 문의 하실 사항이나 필요하신 칼럼 주제가 있으시면 언제든지 댓글로 알려주세요.