매크로

조회 수 1090 추천 0 댓글 14
질문에 대한 궁금증에 어느 정도 해결되었습니다.
답변 주신 분들 감사합니다.



1. 동작 해석
F1을 누르면 이벤트 창에서 "금은동" 이미지가 없으면 드래그 후 시간대기(1s), 찾으면 break

2. 소스
F1::
{
  WinSet, AlwaysOnTop, On, BlueStacks App Player

  Loop
  {
    if(IsImageSquare(clickX, clickY, "Image\OneClick52.bmp", 190, 90, 360, 350))
    if(errorlevel=0)
    {
      break
    }
    if(errorlevel=1)
    {
      Drag(355, 250, 355, 150)
      sleep, 1000
    }
  }
}
return

; 마우스 드래그 함수
MouseDrag(X1, Y1, X2, Y2)
{
  sleep, 500
  SysGet, wCaption, 4
  SysGet, wFrame, 7

  X1 := X1 - wFrame
  Y1 := Y1 - wCaption - wFrame
  C1 := X1 | Y1<<16

  X2 := X2  - wFrame
  Y2 := 2Y - wCaption - wFrame
  C2 := X2 | Y2<<16

  WinGet, ActiveID, ID, BlueStacks App Player

  PostMessage, 0x201, 0, %C1%,, ahk_id %ActiveID%
  PostMessage, 0x200, 0, %C2%,, ahk_id %ActiveID%
  sleep, 100
  PostMessage, 0x202, 0, %C2%,, ahk_id %ActiveID%
  sleep, 300
}

; 이미지함수
IsImageSquare(ByRef clickX, ByRef clickY, ImageName, sX, sY, eX, eY)
{
  CoordMode, Pixel, Screen
  RealWinSize(posX, posY, width, height, "BlueStacks App Player")
  
  sX := sX + posX
  sY := sY + posY
  eX := eX + posX
  eY := eY + posY

  ImageSearch, vX, vY, sX, sY, eX, eY, *70 %ImageName%
  if (ErrorLevel=0)
  {
    clickX := vX - posX
    clickY := vY-  posY
    return true
  }
  if (ErrorLevel=1)
  {
    clickX := 0
    clickY := 0
    return false
  }
}

3. 오작동 영상(8.7MB) 및 설명
- 영상 녹화를 시작하자 마자 매크로실행(F1)했습니다.
- 실행 후 "금은동" 이미지가 없기때문에 드래그를 동작해야하지만 동작하지 않습니다.
- 동작하지 않아서 마우스를 위아래로 움직였더니 이상하개 드래그가 됩니다.
- 마우스 강제 움직임 후 드래그를 하다가 "금은동"이미지를 발견하고 break가 됩니다.

4. 질문
- 소스가 잘 못되었는가요? 소스는 다른 작업 테스트해보니 잘되는데요.
- 이 게임 어플의 이 화면에서 드래그가 안먹히네요. 해답을 못찾겠습니다.
- 혹시 비활성 마우스 휠다운 스크립트 알려주실 수 있을까요? 구글에 검색해보니 postmassage값은 있는데
그 값을 이용해서 휠다운 스크립트 작성하고 동작해봤는데, 전혀 동작이 안되네요.


  • 제발등업좀2 2015.09.26 18:48
    게임마다 드래그 방식이 먹히는게있고 안먹히는게있더군요..
    이렇게하번해보세요 ㅎㅎ 저같은경우 드래그를 10번으로쪼개서.. 드래그합니다.
    드래그비활성(x,y,Mx,MY)
    {
    global ActiveID
    SysGet, capH, 4 ; 캡션Height
    SysGet, bordW, 32 ; 보더Width
    SysGet, bordH, 33 ; 보더Height
    px:=x-bordW/2
    py:=y-bordH/2-capH
    p := px|py<<16

    Mpx:=Mx-bordW/2
    Mpy:=My-bordH/2-capH
    Mp := Mpx|Mpy<<16

    MMP:=MP/10
    SS:=MMP
    ;MsgBox,%MP%//%MMP%
    PostMessage, 0x201, 0, %p%, , %ActiveID%
    Sleep, 500
    Loop,9
    {
    MMP := MMP+SS
    ;MsgBox,%MMP%
    ;PostMessage, 0x200, 0, %MMP%, , %ActiveID%
    ;Sleep, 100
    PostMessage, 0x201, 0, %MMP%, , %ActiveID%
    Sleep, 100
    }
    PostMessage, 0x202, 0, %MMP%, , %ActiveID%
    Sleep, 200
    ;MsgBox,끝
    Return
    }

    이란식으로.. 10등분해서 조금씩움직이니 잘되더라구요
  • 마토깽 2015.09.26 19:01
    힌트 얻어서 소스 수정해서 적용해봤는데 안되네요.
    등업님 말씀대로 어플 자체에 문제가 있는듯 하네요.

    그나저나 postmassage, 0x20A, 가 마우스 휠다운 비활성 명령어 인데 안먹히는 이유가..무엇인지 당췌 모르겠네요.
  • T7GG 2015.10.02 20:04
    저 궁금한거 있습니다

    위 소스 사용해 보았는데요 x값을 바꾸면 어느 숫자를 넣든지 왼쪽으로 이동이 되고

    y값을 바꾸면 위로만 이동이 되는데요 `-`;; 문제가 뭐때문인지 모르겠네요..
  • 류쿤 2015.09.27 10:28

    혹시 블루스택 최신버전이신지요??

  • 마토깽 2015.09.27 21:13
    넵, 블루스택 최신 버전입니다.
  • T7GG 2015.09.28 02:22
    x나y에 + - 50정도 시켜 보시고요 포스트메시지 사이에 0.3초정도 딜레이 걸어보세요 아마될거에요
  • T7GG 2015.09.28 02:26
    아그리고 만약안되면 함수를 다시만드세요 현재 .x.y에서 도착.x.y로 되어있는거를 x.y클릭 값을 주고 중간 .x.y 그리고 도착 .x.y 로 3개로 나누시면 드래그가 되긴하는데 정밀도가 떨어질겁니다
  • T7GG 2015.09.28 02:31
    ex) 드래그1번을 위한 3분할 함수


    sendDrag10( x, y)

    {

        global ActiveID

        SysGet, capH, 4 ; 캡션Height

        SysGet, bordW, 32 ; 보더Width

        SysGet, bordH, 33 ; 보더Height


        px:=x-bordW/2

        py:=y-bordH/2-capH


        p := px|py<<16

        p1 := px+100|py<<16

        PostMessage, 0x201, 1, %p%, , % ActiveID

        Sleep, 100


        PostMessage, 0x201, 1, %p1%, , % ActiveID 

        Sleep, 200

        Return 

    }


    sendDrag11( x, y)

    {

        global ActiveID

        SysGet, capH, 4 ; 캡션Height

        SysGet, bordW, 32 ; 보더Width

        SysGet, bordH, 33 ; 보더Height


        px:=x-bordW/2

        py:=y-bordH/2-capH


        p := px|py<<16


        PostMessage, 0x200, 1, %p%, , % ActiveID

        

        Sleep, 100

        Return 

    }


    sendDrag12( x, y)

    {

        global ActiveID

        SysGet, capH, 4 ; 캡션Height

        SysGet, bordW, 32 ; 보더Width

        SysGet, bordH, 33 ; 보더Height


        px:=x-bordW/2

        py:=y-bordH/2-capH


        p := px|py<<16


     PostMessage, 0x202, 2, %p%, , % ActiveID

        

        Sleep, 100

        Return 

    }
  • 마토깽 2015.09.28 11:20
    3분할의 원리를 잘 이해했습니다. 감사합니다.
    그래서 3분할원리 중 제 1함수인 "sendDrag10( x, y)"의 p1 := px+100|py<<16 주고 안 주고의 차이가 있는데 이유를 모르겠네요. 아직 초보라.. 설명해주시면 감사하겠지만 ㅎㅎ 아무튼 만족합니다.
    저는 이 값을 사용하는 게임에 테스트 해본결과 p1 := px + py +10<<16을 주었더니 잘 됩니다.
    또한 3분할을 다시 짜서 하나의 함수로 구성해봤더니 아주 잘됩니다.
  • T7GG 2015.09.28 19:43
    블루스택 바탕에서는 기존함수가 잘되나.. 어플접속시 안되시는 경우가 빌생합니디 좋은소스인데요 어쩔수없이 3분할을 하고있는데요..가장좋은건 기존함수에 대입해서..해결을 보시는게 좋아요 3분할은 임시일뿐...수고하세요 ^^
  • T7GG 2015.09.28 19:50
    py기존 좌표 클릭을 유지한 상태에서 +10한 py값을 다시클릭함으로 옴기고 두번재 소스에서 이동을 마지막에 클릭을 때주는 방식입니다 이방법은 두번째 마우스 이동소스가 안되서 클릭 유지는 다른 좌표에서 유지해 이동인식을 하기위함입니다 기존소스로 실행하고 블루스택에서 마우스를 움직여주면 화면이 이동되는걸 볼수있습니다 응용3분할한거에요
  • 마토깽 2015.09.28 11:27
    [좌클릭유지 → x,y값으로 드래그 → 좌클릭 땜] 하면 "좌클릭땜" 에서 화면의 드래그가 멈추어야 하는데
    제가 하는 게임의 특성상 쭈욱~ 끝까지 화면이 드래그가 됩니다. 그래서 postmassage값을 몇개 더주었습니다.
    아래는 조언 주신대로 3분할을 테스트하고 다시 하나의 함수로 만든 소스입니다.

    p.s 3분할 테스트시 드래그를 총 두번하던데 그 이유를 알 수 있을까요?

    ;; -----------------------------
    Drag(X1, Y1, X2, Y2)
    {
      sleep, 200
      SysGet, wCaption, 4
      SysGet, wFrame, 7

      loX := oldX
      loY := oldY
      lnX := newX
      lnY := newY

      X1 := X1  - wFrame
      Y1 := Y1 - wCaption - wFrame
      Coor1 := X1 | Y1<<16
      Coor2 := X1 | Y1 +10<<16

      X2 := X2  - wFrame
      Y2 := Y2 - wCaption - wFrame
      Coor3 := X2 | Y2<<16

      WinGet, ActiveID, ID, BlueStacks App Player

      if not getkeystate("Ctrl" , "p")
      {
       PostMessage, 0x201, 0, %Coor1%,, ahk_id %ActiveID%
       sleep, 100

       PostMessage, 0x201, 0, %Coor2%,, ahk_id %ActiveID%
       sleep, 100

       PostMessage, 0x200, 0, %Coor3%,, ahk_id %ActiveID%
       sleep, 100

       PostMessage, 0x202, 0, %Coor3%,, ahk_id %ActiveID
       sleep, 100

       PostMessage, 0x201, 0, %Coor3%,, ahk_id %ActiveID%
       sleep, 100

       PostMessage, 0x202, 0, %Coor3%,, ahk_id %ActiveID%

       log := "# 드래그: " loX ", " loY " to " lnX ", " lnY
       AddLog(log)

       sleep, 300
      }
          else if getkeystate("Ctrl" , "p")  ; 만약 컨트롤키가 눌려있으면
          {    
            Loop   ; 컨트롤키가 안눌려있을때 까지 loop
            {      
              if not getkeystate("Ctrl" , "p") 
              {       
                PostMessage, 0x201, 0, %oldCoor1%,, ahk_id %ActiveID%
                sleep, 100

                PostMessage, 0x201, 0, %oldCoor2%,, ahk_id %ActiveID%
                sleep, 100

                PostMessage, 0x200, 0, %newCoor%,, ahk_id %ActiveID%
                sleep, 100

                PostMessage, 0x202, 0, %newCoor%,, ahk_id %ActiveID%
                sleep, 100

                PostMessage, 0x201, 0, %newCoor%,, ahk_id %ActiveID%
                sleep, 100

                PostMessage, 0x202, 0, %newCoor%,, ahk_id %ActiveID%

                log := "# 드래그: " loX ", " loY " to " lnX ", " lnY
                AddLog(log)

                sleep, 300
                break
              }
              
              sleep, 100
            }
          }
    }
  • T7GG 2015.09.29 09:58
    PostMessage, 0x201, 0, %Coor1%,, ahk_id %ActiveID%
       sleep, 100

       PostMessage, 0x201, 0, %Coor2%,, ahk_id %ActiveID%
       sleep, 100

       PostMessage, 0x200, 0, %Coor3%,, ahk_id %ActiveID%
       sleep, 100

       PostMessage, 0x202, 0, %Coor3%,, ahk_id %ActiveID
       sleep, 100

       PostMessage, 0x201, 0, %Coor3%,, ahk_id %ActiveID%
       sleep, 100

       PostMessage, 0x202, 0, %Coor3%,, ahk_id %ActiveID%

    포스트를 두번쓰셔서 그럴겁니다..

    Coor1 로 클릭유지 Coor2 클릭유지 Coor3 이동하고 클릭 때고 

    여기서 드래그 1번이 끝나고 Coor3좌표를 다시 클릭 유지하고 

    Coor3에서 다시 클릭을 띠게끔 되어있네요

    Coor1 2 3 거쳐 드래그를 진행하면 화면이동이 발생하는데

    Coor3을 다시 클릭 하고 때게되면 화면이동중 중간 0.1초 이동사이에 다시 클릭해서

    좌표값이 바뀌며 2번 드래그 되는거 같네요

    제가보기엔

    PostMessage, 0x201, 0, %Coor1%,, ahk_id %ActiveID%
       sleep, 100

       PostMessage, 0x201, 0, %Coor2%,, ahk_id %ActiveID%
       sleep, 100

       PostMessage, 0x200, 0, %Coor3%,, ahk_id %ActiveID%
       sleep, 100

       PostMessage, 0x202, 0, %Coor3%,, ahk_id %ActiveID

    여기까지만 쓰시는게 맞을거 같네요 `-`a

    실질적으로는 테스트를 진행하셔야됩니다

    제 짧은 소견입니다...^ㅡ^ 수고하세요
  • poerty 2015.10.24 14:51

    postmessage 말고 controlclick 으로는 어려울까요??


    postmessage 를 아직 못 익혀서 ㅜㅜ


List of Articles
분류 제목 글쓴이 최근변경 추천
질문 가상화 관련해서 질문드립니다 답변부탁드려요 오토나 2016.08.22 0/0
질문 가상모니터가 주모니터가 되엇는데 변경이 안되요 도... 3 혁재당 2015.12.06 0/0
질문 가상모니터 비활성에 관련되어 질문이 있습니다 12 사랑사랑 2015.09.21 0/0
질문 가상모니터 관련해서 질문 좀... 10 smile3290 2015.02.26 0/0
질문 가능 여부좀 알고싶습니다! 4 다중이 2015.05.11 0/0
질문 가끔씩 루프가 제대로 안도는거 같은데, 어떻게 해야할... 2 rh1406 2014.12.31 0/0
질문 가가가이님이 만드신 바람 매크로 질문드립니다. 1 zzoo3i 2020.10.30 0/0
질문 ㅠㅠ 웃긴일이발생했ㅅ브니다!! 4 뚜르따르또르 2015.08.18 0/0
정보 ㅋㅋㅋㅋ 베스트글 보려고 2랩찍으려다가 2랩 찍기전에... 6 sica 2018.03.03 0/0
질문 ㅁㅇㅍ ngs우회방법좀 알려주실분? 6 강화사신 2019.03.08 0/0
자유 {1} 가입 인사글 입문 4일차 뉴비 입니다~ 3 치느 2020.02.20 0/0
질문 `키를 핫키로 꼭 지정하고싶은데 부탁드립니다. 2 검정다람쥐 2015.12.17 0/0
질문 `키 스크립트에서 인식안하나요? 서시 2015.06.13 0/0
자유 ^^월요일 아침댓바람부터 질문좀 ㅎㅎㅎ.... 2 제발등업좀2 2015.11.23 0/0
질문 [해결됨] 오토핫키 핸들 관련 질문 입니다. 1 반수현 2021.04.02 0/0
질문 [해결]소스완성하고 매크로 동작 테스트 중인데요... 13 마토깽 2022.12.14 0/0
질문 [해결]녹스앱플 오핫 이미지 서치 질문입니다 27 T7GG 2015.09.22 0/0
질문 [해결]녹스앱플 설정 및 이미지서치 ㅠ 6 T7GG 2015.08.19 0/0
질문 [해결]Smartgui(스마트구이) 체크박스 동작 질문 4 마토깽 2022.12.14 0/0
질문 [해결] 아래 작동중지에 대한 수정소스인데요. 8 마토깽 2022.12.14 0/0
Board Pagination Prev 1 ... 164165166167168169170171172 ... 209 Next
/ 209

전체 최신 인기글

전체 주간 인기글