매크로

조회 수 1093 추천 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
분류 제목 글쓴이 최근변경 추천
질문 [해결]소스완성하고 매크로 동작 테스트 중인데요... 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
질문 [해결] 실행시 Gui글자를 읽어들이지 못합니다. 5 마토깽 2015.10.26 0/0
질문 [해결] 비활성 드래그 오작동합니다. 14 마토깽 2015.10.24 0/0
질문 [해결] FileSelectFile, 저장형식에 대해 궁금합니다. 10 마토깽 2015.10.29 0/0
질문 [해결] "" 내 변수 호출 질문 3 아잉뿌잉 2015.12.10 0/0
질문 [초보질문] 포스트메시지가 왜 안먹힐까요ㅜ 10 HyunsD 2015.11.27 0/0
질문 [초보] 매크로 실행 질문 9 알제리킴 2016.03.13 0/0
질문 [질문]예지력님 스킨적용에 대해 궁금한게 있습니다. 5 마토깽 2015.11.24 0/0
질문 [질문]사용pc환경에 따른 이미지인식이.. 5 마토깽 2019.11.26 0/0
질문 [질문]듀얼모니터 가상 화면으로 보내기 + 위치고정 춥다람쥐 2015.07.05 0/0
질문 [질문] 현재 활성화된 Clinet에서 영역값을 알고 싶은... 5 마토깽 2015.11.09 0/0
질문 [질문] 갯수 : 2개 8 USW 2015.04.13 0/0
질문 [질문] ToolTip 잘 모르겠는데요. 4 마토깽 2015.07.20 0/0
질문 [질문] Settimer 사용시 일시정지 기능 5 마토깽 2015.11.19 0/0
질문 [질문] Gui Creator, SaveFile(.xml) Load 실패 1 마토깽 2015.10.29 0/0
질문 [입문자]랜덤키입력+랜덤딜레이 질문이요 1 라디에스 2017.11.18 0/0
Board Pagination Prev 1 ... 133134135136137138139140141 ... 173 Next
/ 173

전체 최신 인기글

전체 주간 인기글