오토핫키 강좌 #5 - 비활성 마우스 클릭 (오토핫키 붙여넣기)




안녕하세요~ 킴영감 입니다~


오늘 드디어 비활성 매크로의 첫 걸음을 때려고 합니다!!


비활성 매크로를 쉽게 얘기하면 매크로가 돌아가는 중에 다른 작업을 할 수 있는 것을 말합니다.


이를 구현하는데 있어 가장 중요한 기능인 마우스 클릭을 비활성으로 구현해보았으며,


붙여넣기 강좌인 만큼 모든 분들이 붙여넣듯이 바로 사용하실 수 있도록 강좌를 진행할 것입니다.


그럼 강좌를 시작하겠습니다.


1. PostMessage


우선 이해를 돕기위해 몇가지 부연설명을 드리겠습니다.


윈도우Message를 기반으로 사용자와 상호작용을 합니다. 이는 윈도우 프로그래밍에서 매우 중요한 개념이지만 어렵게 생각하실 필요는 없습니다. 예를 들어 마우스를 움직이는 행동은 윈도우에게 마우스를 특정 좌표로 옮기라는 쪽지(Message)를 보내는 것과 같습니다. 윈도우는 받은 쪽지에 적힌 내용을 수행하는 것입니다. "무슨말일까?"라고 더 생각하지 마시고 그래도 받아들이시면 됩니다^^


이처럼 윈도우와 상호작용을 하는 방법에는 SendMessagePostMessage가 있습니다. 

난이도가 있는 강좌가 아니기 때문에 쉽게 개념만 설명드리면 SendMessage는 쪽지를 보내고 그자리에서 바로 답장을 받아오는 것이고, PostMessage는 쪽지를 보내기만 하는 것을 의미합니다. 답장을 받는 것은 쪽지에 적힌 내용을 수행 여부를 의미합니다. 개념잡기가 어려우신분은 그냥 넘어가시고 사용방법만 익히시면 되겠습니다^^


위의 두가지 방법 중 PostMessage를 사용해서 비활성 클릭을 구현할 것입니다.


윈도우 프로그래밍을 해본 분들을 위해 간략하게 PostMessage사용 방법을 알려드리겠습니다.



PostMessage, Message, wParam, lParam, Control, WinTitle, WinText, ExcludeTitle, ExcludeText 


뭔가 복잡해 보입니다. 각 요소들의 의미를 설명드리겠습니다.


Message - 사용자가 윈도우로 보내는 Message 입니다. 각 기능(마우스 클릭 등)에 할당된 고유의 숫자가 있습니다.

wParam과 lParam - Message를 보낼 때 기능의 동작과 관련있는 정보를 보내는 부분입니다.

Control - 윈도우 핸들을 의미합니다. 생략해도 무방합니다.

WinTitle - 메세지를 보낼 창 이름을 의미합니다.

WinText - 메세지를 보낼 창에 포함되어 있는 text를 의미합니다.

ExcludeTitle - 제외할 창을 적는 부분입니다.

ExcludeText - 제외할 Text를 적는 부분입니다.


뭔가 잡다한 것들이 많이 붙어 있죠? 실제로 사용하실 때에는 아래와 같이 사용하시면 됩니다.


 PostMessage, Message, wParam, lParam, , WinTitle


이렇게 하면 윈도우프로그래밍을 하시던 분들을 바로 사용하실 수 있을 것입니다. "이건뭐지?"라는 생각이 드시는 분은 위에서 설명한 각 요소의 의미만 기억하시고 다음으로 넘어가시면 됩니다.



2. 비활성 클릭 함수


대부분 모니터 한대만 사용하시겠지만 듀얼 모니터를 사용할 때에도 사용 가능하도록 알려드리겠습니다.


우선 비활성 클릭 함수 스크립트입니다.


비활성 클릭


우선 코드 설명을 드리겠습니다.


함수를 실행할 때 넘겨받는 변수인 "x좌표"와 "y좌표"는 ImageSearch에서 찾은 이미지의 좌표입니다.


함수가 실행되면 WinGetPos를 사용해서 원하는 프로그램 창의 좌표를 구합니다.


그 다음으로 이미지의 좌표와 창의 좌표를 이용해서 프로그램 창 내부에서 이미지의 좌표를 계산하고 "내부좌표x"와 "내부좌표y"변수에 저장합니다.


PostMessagelParam값은 32비트로 구성되어야하며 마우스 클릭의 경우 x와 y의 좌표를 묶어서 32비트로 변환하게 됩니다. 어려우시면 lparam이라는 변수에 클릭할 좌표가 들어가고 좌표를 변수에 저장할 때 "x좌표|y좌표<<16"의 형식을 유지해준다고 이해하시면 됩니다.


PostMessage를 사용해서 마우스 클릭을 할 때 마우스를 눌렀다가 때는 동작을 하는 것입니다. 마우스를 누르는 동작을 의미하는 Message 값은 "0x201"이며 이때 wParam값은 항상 1입니다. 반대로 마우스를 때는 동작을 의미하는 Message 값은 "0x202"이며 이때 wParam값은 항상 0입니다.


WinTitle에는 블루스택을 이용했기 때문에 BlueStacks App Player라고 적었습니다. WinGetPos를 사용할 때와 같이 각자 사용할 프로그램의 이름을 적으시면 됩니다. 여기서 중요한 것은 반드시 작업관리자를 열어서 "응용 프로그램" 탭에 있는 이름으로 적어주셔야 한다는 것입니다. (띄워쓰기까지 똑같이 적어주셔야 합니다.)


마지막 줄에는 1초의 대기시간을 줬습니다. 여기서 대기시간을 주는 이유는 버튼을 눌렀을 때 화면전환 시간을 기다리는 역할을 합니다





이제 위 함수를 적용하는 방법을 알아보겠습니다.

붙여넣기 3강에서 실습했던 내용을 아래와 같이 수정하세요.



붙여넣기 3강에서는 특정 윈도우의 영역에서만 이미지를 검색하는 방법에 대해 실습 했었습니다. 모니터를 두개 이상 사용할 경우 반드시 ImageSearch의 영역을 지정해주셔야 올바르게 동작하기 때문에 위 그림의 첫번째 빨간 박스와 같이 영역을 구한 뒤 두번째 빨간박스와 같이 영역을 지정해주셔야 합니다.


3번째 빨간 박스부분이 비활성 클릭을 적용한 부분입니다. 엄청 간단하죠? 맨 아래 빨간 박스에 있는것 처럼 "비활성왼쪽클릭" 함수를 붙여넣듯 작성해 주신 뒤, ImageSearch에서 찾은 좌표를 가지고 비활성클릭함수실행만 시켜주시면 되는 것입니다.


각자 실습한 스크립트를 실행 해 보시면 클릭할 때 마우스가 움직이지 않는 것을 확인하실 수 있을 것입니다. 매크로를 돌리는 중에도 다른작업을 할 수 있게 된거에요~^^



이번 강좌는 비활성 클릭을 구현하는 필수 요소인 "PostMessage"의 간략한 사용방법과 이를 사용한 비활성클릭 함수 구현 적용방법에 대해서 알아봤습니다. Message를 처음 접하신 분들에게는 다소 어려울 수 있지만 기본적인 개념만 가지고 있으면 사용하시는 데에는 어려움이 없을 것입니다. "난 하나도 모르겠다"라고 생각하시는 분은 일단 붙여넣어서 사용하시다가 조금 익숙해 지시면 다시 공부하시면 됩니다^^


오토핫키로 매크로를 만들고 싶어하시는 분들의 최대 관심사인 비활성클릭에 대한 강좌를 해서 그런지 뿌듯한 느낌이 드네요~^^

항상 말씀 드렸듯이 반복적으로 실습하는 것이 가장 중요합니다. 꾸준히 노력하시다보면 정말 멋진 프로그램이 완성된 것을 볼 수 있을 것입니다. (제 강좌를 안보신 분은 꼭!! 기초강좌부터 차례대로 보시기 바랍니다)


그럼 붙여넣기 다섯번째 강좌를 마치겠습니다.

블로그 이미지

킴영감

프로그래밍과 게임공략, 게임과 관련된 프로그램에 대한 내용을 다룹니다.

댓글을 달아 주세요

  • 이전 댓글 더보기
  • 열뿌우우 2016.01.16 15:21  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 질문이 있어서 글을남깁니다.
    이미지 서치 안하고 바로 블루스택 내에서 클릭하게 하려고하는데 잘 안되네요.. 좌표를 0~1900(화면 해상도) 까지 Loop를 돌려도 아무런 반응이 없네요
    A := x좌표|y좌표<<16
    PostMessage, 0x201, 1, %A%, ,Bluestacks App Player
    PostMessage, 0x202, 0, %A%, ,Bluestacks App Player

  • 열뿌우우 2016.01.16 16:08  댓글주소  수정/삭제  댓글쓰기

    단순한 코드입니다.
    시작:
    비활성왼쪽클릭(822,512)
    return

    비활성왼쪽클릭(x좌표,y좌표)
    {
    A := x좌표|y좌표<<16
    PostMessage, 0x201,1,%A%, ,Bluestacks App Player
    PostMessage, 0x202,0,%A%, ,Bluestacks App Player
    }
    PostMEssage로 했을땐 안되고
    ControlClick 으로는 잘됩니다.
    ControlClick, x%x좌표% y%y좌표%, Bluestacks App Player, , left, 4, NA
    단순히 블루스택에서 PostMessage를 막은건 아닐까요?

    • 킴영감 2016.01.27 14:58 신고  댓글주소  수정/삭제

      블루스택에서 postmessage는 동작합니다. 하지만 앱마다 내부 창을 구성하는 방법이 달라서 안되는 경우가 있습니다. 그럴경우에는 postmessage를 사용할 수 없다고 생각하시면 되고 사용하신 것처럼 controlclick이다 adb명령어를 사용하시면 됩니다.^^

  • 2016.01.20 21:48  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  • 2016.01.30 18:31  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  • Lrapa 2016.02.13 15:08  댓글주소  수정/삭제  댓글쓰기


    f1::
    Loop
    {
    CoordMode, Pixel, Screen

    WinGetPos, pos_x, pos_y, width, height,BlueStacks App Player
    x_right := width + pos_x
    y_bottom := height + pos_y


    ImageSearch, FoundX, FoundY, %pos_x%, %pos_y%, %x_right%, %y_bottom%, *50 %A_ScriptDir%/Image/10.bmp
    if (errorlevel=0)
    {
    비활성왼쪽클릭(FoundX, FoundY)
    sleep,1000
    }
    }
    return

    비활성왼쪽클릭(x좌표, y좌표)
    {

    wingetpos,w_x,w_y,w_w, W_h, BlueStacks App player

    내부좌표X := x좌표 - w_x
    내부좌표y := y좌표 - w_y

    lparam := 내부좌표x|내부좌표y<<16
    PostMessage, 0x201, 1 , %lparam%, ,BlueStacks App Player
    Postmessage, 0x202, 0 , %lparam%, ,BlueStacks App Player
    sleep,1000
    }
    f3::ExitApp
    f4::Reload

  • Lrapa 2016.02.13 15:09  댓글주소  수정/삭제  댓글쓰기

    위에 스크립트는 간단하게 작동이 되나 확인차원에서 짧게 만들었습니다.
    지우고 다시 쓰고 지우고 다시쓰고 하는데 작동이 안되서 매우 아쉽네요 ...
    어떤점을 고쳐야할지 감이 안와서 고민입니다.

  • Lrapa 2016.02.13 16:41  댓글주소  수정/삭제  댓글쓰기

    F1::
    Loop
    {
    CoordMode, Pixel, Screen

    WinGetPos, pos_x, pos_y, width, height,BlueStacks App Player
    x_right := width + pos_x
    y_bottom := height + pos_y


    ImageSearch, FoundX, FoundY, %pos_x%, %pos_y%, %x_right%, %y_bottom%, *70 %A_ScriptDir%/Image/10.bmp
    if (errorlevel=0)
    {
    비활성왼쪽클릭(FoundX, FoundY)
    sleep,1000
    msgbox,find
    sleep,1000
    }

    ImageSearch, FoundX, FoundY, %pos_x%, %pos_y%, %x_right%, %y_bottom%, *50 %A_ScriptDir%/Image/10.bmp
    if (errorlevel=1)
    {
    비활성왼쪽클릭(FoundX, FoundY)
    sleep,1000
    msgbox,nofind
    sleep,1000
    }
    }
    return

    비활성왼쪽클릭(x좌표, y좌표)
    {

    wingetpos,w_x,w_y,w_w, w_h, BlueStacks App player

    내부좌표x := x좌표 - w_x
    내부좌표y := y좌표 - w_y

    lparam := 내부좌표x|내부좌표y <<16
    PostMessage, 0x201, 1 , %lparam%,,BlueStacks App Player
    Postmessage, 0x202, 0 , %lparam%,,BlueStacks App Player
    sleep,1000
    }
    f3::ExitApp
    f4::Reload

    이고... 메시지 박스조차 아무것도 안뜨는걸 봐서는 이미지 조차 못찾는 것 같은데 어떻게해야 해결 할수 있을까요? ...

    • 킴영감 2016.02.13 17:38 신고  댓글주소  수정/삭제

      이미지를 찾았을 때와 못찾았을 때 모두 메세지박스가 안뜬다면 프로그램이 이미지파일을 못찾는 것입니다. 이미지파일명과 확장자명, 파일 경로를 확인해보시면 될 것 같습니다^^

  • Lrapa 2016.02.13 18:40  댓글주소  수정/삭제  댓글쓰기

    답변 감사합니다. 이미지 파일명과 확장자 파일 경로를 확인해보았는데도 안되더라구요.
    피곤해서 쉬었다가 다음에 해봐야겠습니다. 저번에도 하루종일 붙잡았는데 해결 못하였는데 해결이 안되네요;;
    작업영역도 잘 설정된거같은데 무엇이 문제인지 모르겠군요
    힘내보겠습니다!!

    • 킴영감 2016.02.13 21:31 신고  댓글주소  수정/삭제

      블루스택의 경우 게임마다 차이가 날 수 있습니다. 위에서 말씀드린 부분이 틀리지 않았다면 게임자체에서 블루스택 내부에서 창을 여러개로 나누어서 사용하는 것이기 때문에 postmessage로는 비활성 클릭이 불가능합니다.
      한가지 해결방법으로 adb 명령어라는 것이 있으며 google에 오토핫키 adb 터치 (또는 클릭) 이라는 키워드로 검색해보시면 자료가 나올 것입니다~^^

  • 2016.02.14 01:49  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • 킴영감 2016.02.14 18:32 신고  댓글주소  수정/삭제

      세븐나이츠는 postmessage가 동작합니다.

      테스트 하신 코드를 다시 확인해보니 Coordmode의 문제가 아닐까 생각되네요^^

      비활성왼쪽클릭 함수 내부에 아래 코드를 넣어서 테스트 해보시면 될 것같습니다.^^

      CoordMode, Mouse, Window

  • 2016.02.15 11:48  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  • 2016.02.20 22:04  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  • 2016.06.14 15:43  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  • 김대운 2016.06.28 16:51  댓글주소  수정/삭제  댓글쓰기

    어디가 잘못된걸까요 ? 이틀쨰 붇들고 실랑이걸이고있네요 ㅎ
    Return
    #Singleinstance Force
    #NoEnv
    Return
    Button자동재접:
    Gui,Submit,nohide
    GuiControl,,A,시작
    Loop
    {
    CoordMode, Pixel, Screen
    CoordMode, mouse, Screen
    WinGetPos, pos_x,pos_y,width,height,MEmu 2.6.5 - MEmu
    x_right := width + pos_x
    y_bottom:=height+pos_y
    ImageSearch,FoundX,FoundY,%pos_x%,%pos_y%,%x_right%,%y_bottom%, *50 game%A_index%.bmp

    if (Errorlevel = 0)

    {

    ;~이미지를 찾았을때 실행할 내용

    클릭(FoundX,FoundY)
    Sleep,시간



    }

    sleep 100

    }
    return

    클릭(x좌표,y좌표)
    {
    wingetpos, w_x,w_y,w_w,w_h,MEmu 2.6.5 - MEmu

    내부좌표x := x좌표 - w_x
    내부좌표y := y좌표 - w_w

    1param := 내부좌표x|내부좌표y<<16
    PostMessage,0x200,0,%N%,,MEmu 2.6.5 - MEmu
    PostMessage,0x201,1,%N%,,MEmu 2.6.5 - MEmu
    }

    GuiClose:
    ExitApp

  • 2017.11.14 02:53  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  • 오토핫키 2018.01.02 02:10  댓글주소  수정/삭제  댓글쓰기

    활성창 F7좌표~F8좌표 까지 좌표지정
    F9 비활성우클릭 반복실행을 하고싶은데 이틀내내 붙잡고 이래저래 해봐도 도저히 안되서 글남깁니다 ㅠㅠ
    랜덤이아닌 그냥 고정 좌표로라도 활성창에서 지정한 좌표로 비활성상태가 됬을때도 반복클릭하고싶은데.. 이건안되나요?

    F7::
    MouseGetPos, X1x, Y1y
    return
    F8::
    MouseGetPos, X2x, Y2y
    F9::
    toggle := !toggle
    ifequal, toggle, 0, settimer,loop,off
    ifequal, toggle, 1, settimer,loop,on
    return
    loop:
    {
    CoordMode, Pixel, Screen
    WinGetPos, pos_x, pos_y, width, height, 제목 없음 - 그림판
    x_right := width + pos_x
    y_botoom := height + pos_y

    random, FoundX,X1x,X2x
    random, FoundY,Y1y,Y2y
    비활성우클릭(FoundX, FoundY)
    }
    return

    비활성우클릭(x좌표, y좌표)
    {
    WinGetPos, w_x, w_y, w_w, w_h, 제목 없음 - 그림판
    내부좌표x := x좌표 - w_x
    내부좌표y := y좌표 - w_y
    lparam := 내부좌표x|내부좌표y<<16
    PostMessage, 0x204, 1, %lparam%, ,제목 없음 - 그림판
    PostMessage, 0x205, 0, %lparam%, ,제목 없음 - 그림판
    sleep, 200
    }

  • 오토핫키 2018.01.02 17:59  댓글주소  수정/삭제  댓글쓰기

    지정한 랜덤좌표로 클릭을 하게 하고 싶지만
    그냥 단순 활성화창에서 지정한 x,y좌표로 클릭만 이라도 되면좋겠네요 ㅠㅠ
    염치없지만 마지막으로 도와주시면 감사하곘습니다.

    -----------------------------------------------------------------이하 랜덤좌표 우클릭 실패 소스
    ActiveID:=유틸리티
    global ActiveID

    F1:: ;랜덤좌표 비활성 우클릭
    {
    CoordMode, Pixel, Screen
    WinGetPos, pos_x, pos_y, width, height, %ActiveID%
    x_right := width + pos_x
    y_bottom := height + pos_y

    random, RandomX, %pos_x%, %x_right%
    random, RandomY, %pos_y%, %y_bottom%

    비활성우클릭(RandomX,RandomY)
    }
    return

    비활성우클릭(x좌표,y좌표)
    {
    WinGetPos, w_x, w_y, w_w, w_h, %ActiveID%

    내부좌표x := x좌표 - w_x
    내부좌표y := y좌표 - w_y

    lparam := 내부좌표x|내부좌표y<<16
    PostMessage, 0x204,1, %lparam%, ,%ActiveID%
    PostMessage, 0x205,0, %lparam%, ,%ActiveID%
    sleep, 1000
    }
    ----------------------------------------------------------------이하 단순 우클릭 실패 소스
    F1:: ;활성창 좌표획득
    MouseGetPos, x, y
    return

    F2:: ;비활성 우클릭
    내부좌표x := x
    내부좌표y := y
    lparam := 내부좌표x|내부좌표y<<16
    PostMessage, 0x204,1, %lparam%, ,유틸리티
    PostMessage, 0x205,0, %lparam%, ,유틸리티
    return

    • 킴영감 2018.01.02 21:34 신고  댓글주소  수정/삭제

      우클릭에대한 파라미터가 틀리셨네요^^
      PostMessage, 0x204, 2, %lparam%, , %ActiveID%
      PostMessage, 0x205, 0, %lparam%, , %ActiveID%
      이렇게 하시면 됩니다^^

  • 그어어 2018.04.12 15:20  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 킴영감님, 오토핫키를 공부하고 있는 유저입니다.

    컴파일까지 모두 마쳤는데 클릭 실행이 잘 되질 않네요...ㅠ 반응이 없으니 뭐가 원인인지도 모르겠습니다.





    Gui, add, text, x30 y5 w110 h20, 세븐나이츠 매크로
    gui, add, text, x60 y25 w50 h20 vA, 준비
    gui, add, text, x60 y50 w50 h20 vB, 0회
    gui, add, checkbox, x60 y80 w100 h20 v강제진행, 강제진행
    gui, add, button, x20 y110 w130 h20, 시작
    gui, add, button, x20 y130 w130 h20, 종료
    gui, show


    global 매크로시작 := false


    F2::
    {
    매크로시작 := true

    gui,submit,nohide
    guicontrol, , A, 시작

    while(매크로시작 = true)
    {

    coordmode, pixel, screen
    wingetpos, pos_x, pos_y, width, height, BlueStacks 3(32비트)(3)
    x_right := width + pos_x
    y_bottom := height + pos_y

    쫄작()

    if(강제진행 = 1)
    {
    imagesearch, FoundX, FoundY, %pos_x%, %pos_y%, %x_right%, %y_bottom%, *40 C:\Users\ksbel\Google 드라이브\동기화\Kim\유틸리티\AutoHotkey\Image\진행.bmp
    if (errorlevel = 0)
    {
    FoundX += 25
    FoundY += 25

    비활성왼쪽클릭함수(FoundX, FoundY)
    }

    imagesearch, FoundX, FoundY, %pos_x%, %pos_y%, %x_right%, %y_bottom%, *40 C:\Users\ksbel\Google 드라이브\동기화\Kim\유틸리티\AutoHotkey\Image\확인.bmp
    if (errorlevel = 0)
    {
    FoundX += 25
    FoundY += 25
    비활성왼쪽클릭함수(FoundX, FoundY)
    }

    }

    }
    }





    쫄작()
    {
    imagesearch, FoundX, FoundY, %pos_x%, %pos_y%, %x_right%, %y_bottom%, *50 C:\Users\ksbel\Google 드라이브\동기화\Kim\유틸리티\AutoHotkey\Image\시작하기.bmp
    if (errorlevel = 0)
    {
    FoundX += 25
    FoundY += 25
    비활성왼쪽클릭함수(FoundX, FoundY)
    }

    imagesearch, FoundX, FoundY, %pos_x%, %pos_y%, %x_right%, %y_bottom%, *40 C:\Users\ksbel\Google 드라이브\동기화\Kim\유틸리티\AutoHotkey\Image\루리1.bmp
    if (errorlevel = 0)
    {
    FoundX += 25
    FoundY += 25
    비활성왼쪽클릭함수(FoundX, FoundY)

    FoundY += 50
    비활성왼쪽클릭함수(FoundX, FoundY)
    }
    imagesearch, FoundX, FoundY, %pos_x%, %pos_y%, %x_right%, %y_bottom%, *40 C:\Users\ksbel\Google 드라이브\동기화\Kim\유틸리티\AutoHotkey\Image\루리3.bmp
    if (errorlevel = 0)
    {
    FoundX += 25
    FoundY += 25
    비활성왼쪽클릭함수(FoundX, FoundY)

    FoundY += 50
    비활성왼쪽클릭함수(FoundX, FoundY)
    }

    imagesearch, FoundX, FoundY, %pos_x%, %pos_y%, %x_right%, %y_bottom%, *40 C:\Users\ksbel\Google 드라이브\동기화\Kim\유틸리티\AutoHotkey\Image\루리 각성.bmp
    if (errorlevel = 0)
    {
    비활성왼쪽클릭함수(FoundX, FoundY)
    }

    imagesearch, FoundX, FoundY, %pos_x%, %pos_y%, %x_right%, %y_bottom%, *50 C:\Users\ksbel\Google 드라이브\동기화\Kim\유틸리티\AutoHotkey\Image\바로시작1.bmp
    if (errorlevel = 0)
    {
    FoundX += 25
    FoundY += 25
    비활성왼쪽클릭함수(FoundX, FoundY)
    }else{
    imagesearch, FoundX, FoundY, %pos_x%, %pos_y%, %x_right%, %y_bottom%, *40 C:\Users\ksbel\Google 드라이브\동기화\Kim\유틸리티\AutoHotkey\Image\바로시작2.bmp
    if (errorlevel = 0)
    {
    FoundX += 25
    FoundY += 25
    비활성왼쪽클릭함수(FoundX, FoundY)
    }
    }





    }



    F3::
    {
    매크로시작 := false

    gui,submit,nohide
    guicontrol, , A, 정지
    }
    return


    비활성왼쪽클릭함수(x좌표, y좌표)
    {
    wingetpos, w_x, w_y, w_w, w_h, BlueStacks 3(32비트)(3)

    내부좌표x := x좌표 - w_x
    내부좌표y := y좌표 - w_y

    lparam := 내부좌표x|내부좌표y<<16
    postmessage, 0x201, 1, %lparam%, , BlueStacks 3(32비트)(3)
    postmessage, 0x202, 0, %lparam%, , BlueStacks 3(32비트)(3)
    sleep, 1000
    }



    button종료:
    {
    매크로시작 := false
    exitapp
    }
    return

    F10::
    {
    매크로시작 := false
    exitapp
    }
    return




    잘못된 곳이 있을까요?

    • 2018.04.12 15:21  댓글주소  수정/삭제

      비밀댓글입니다

    • 킴영감 2018.04.12 20:57 신고  댓글주소  수정/삭제

      저도 수정을 못해요...ㅠ
      답변확인하시고 원하시면 삭제 해드릴게요^^
      우선 GUI 생성하는 부분이 끝나는 지점에 return이 빠졌습니다.
      F2 라벨이 끝나는 지점에도 return이 빠졌구요

      함수에서 변수 사용하실 때 글로벌로 선언되지 않아 이미지를 찾을 좌표영역이 문제가 될 수 있습니다.

      위 사항들 확인해보시면 될 것 같아요^^

  • yacrss 2018.06.19 12:36  댓글주소  수정/삭제  댓글쓰기

    안녕하세요

    오늘도 이것저것 만지다가 막히는 부분이 있어 이렇게 질문글을 적습니다..ㅎㅎ

    PostMessage를 이용하여 키다운을 하려합니다만..

    키다운이 안되는것 같습니다.

    예를들어

    PostMessage, 0x100, 18, 540540929, , 작업명

    Sleep, 1000

    PostMessage, 0x101, 18, 540540929, , 작업명


    이렇게 작성시 제 상식으론 센드 명령어 처럼 알트키를 1초동안 눌렀다 땐다.

    이렇게 알고 있습니다만..

    확인 해보니 슬립이 있으나 없으나 누름과 동시에 바로 올라옵니다..


    쉽게 말해 PostMessage, 0x100 48, 720897, , 작업명 ;숫자 0키

    위 처럼 한줄만 적었을시..

    0x101을 만나기 전까진 0키를 눌려있어야 하지 않습니까?

    메모장으로 확인 해봐도 0하나만 적고 끝납니다..


    포스트메시지로 키 다운 구현이 불가능한것인지요?

    아니면 제가 잘못 이해하고 있는걸까요..?

  • 2019.03.23 19:55  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  • asdf 2020.02.18 14:25  댓글주소  수정/삭제  댓글쓰기

    이거 예제가 잘못된게 아닌가요?

    포스트 메세지는 좌표가 client 기준으로 점을 클릭하는데

    61,62번줄에

    내부좌표x := x좌표 - w_x
    내부좌표y := y좌표 - w_y

    계산은 결국에 window 좌표 기준으로 클릭을 요구하고 있습니다.

    window 와 client 는 좌표 오차가 있을텐데요.