오토핫키 커뮤니티

질문
2016.06.24 17:42

postmessage 명령 질문입니다.

조회 수 374 추천 0 댓글 5

오토핫키를 처음 사용하는 초보입니다.


근 한달간 오토핫키 이미지서치하고 mouseclick 명령어를 사용해서 매크로를 만들었습니다.

이번에 비활성화라는 것을 알게되어서 이미지서치까지는 성공했는데 그 다음이 안되고 있습니다.

(최종적으로 녹스에 적용시킬 예정이며, 현재는 테스트하려고 explorer에서 작업중입니다)



screen 좌표 찾아내고

postmessage 명령은 client 좌표여야 한다고 검색에서 배워서 screen좌표를 찾은 것을

수정수정해서 client 값을 가지도록 변수에 저장했는데


문제는 클릭(이동도 마찬가지)이 안됩니다.


도움을 받고싶어서 그림판으로 그린것과 spy, 메시지박스로 출력한 화면도 첨부합니다.


[소스]


#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
#SingleInstance, force
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
SetBatchLines,-1 ; 기본적으로 라인마다 Sleep,10 수행을 제거
ListLines, Off ; 최근 실행된 코드라인 기억
#KeyHistory 0 ; 키로그

; 기본 설정
CoordMode, Pixel, Screen
CoordMode, ToolTip, Screen
global ActiveID, DebugMode, WindowCaptionHeight, WindowBorderWidth, WindowBorderHeight, winX, winY

SysGet, WindowCaptionHeight, 4 ; 캡션Height
SysGet, WindowBorderWidth, 32 ; 보더Width
SysGet, WindowBorderHeight, 33 ; 보더Height

ActiveID := "(주)  - Internet Explorer"
DebugMode := 1

Gui, Add, Button, gTestSearch, 이미지 서치
Gui, Add, Button, gTestClick, 이미지 클릭
Gui, Add, Button, gRestart, 재시작
Gui, Show, , 테스트
Return

GuiClose:
ExitApp
Return

TestSearch:
; 기본 서치
MsgBox, % CheckImage( "test.bmp")
Return


TestClick:
; 기본 클릭 테스트
;MsgBox, % ClickImage( "test.bmp")
MsgBox, % ClickImage( "test.bmp")
Return


Restart:
Reload
Return



; 이미지 서치
; seconds : 시간 지정 (기본설정상 1초 = 10번 시도, 0.5초 = 5번 시도함)
; imgX, imgY : 리턴받기 위해 사용
; fromX , fromY , toX , toY : 이미지 서치 범위 지정
; 리턴값 : 1 = 이미지 찾음 , 0 = 이미지 못찾음, -1 = 이미지 파일 없음
CheckImage(img, seconds=0, ByRef imgX="", ByRef imgY="", fromX=0, fromY=0, toX=0, toY=0) {
    global ActiveID, DebugMode
    Sleep, 10

     If ( ActiveID)
        WinGetPos, winX, winY, winW, winH, % ActiveID
    Else
        winX := 0, winY := 0, winW := A_ScreenWidth, winH := A_ScreenHeight
 
    sleepTime := 100
    times := seconds * (1000 / sleepTime)
    If ( times=0)
        times := 1

    x := winX, y := winY, w := winX+winW, h := winY+winH
    If (fromX && fromY && toX && toY)
    {
        w := x+toX, h := y+toY, x := x+fromX, y := y+fromY

        If ( DebugMode = 1)
        {
            ToolTip, 범위시작, x, y, 11
            ToolTip, 범위끝, w, h, 12
        }
    }

    Loop, %times%
    {
        ImageSearch, oX, oY, x, y, w, h, *50 %A_ScriptDir%\%img%
        If ( ErrorLevel = 0)
        {
            imgX := oX
            imgY := oY
            msgbox, imgx : %imgx%   imgy : %imgy%
            If ( DebugMode = 1)
            {
                ;ToolTip, %img%, imgX, imgY, 10
            }
            Return 1
        }
        Else If ( ErrorLevel = 2)
        {
            MsgBox, , , 이미지 없음 : %img% , 1
            Return -1
        }
        Sleep, %sleepTime%
    }
    Return 0
}

; 비활성 이미지 클릭
; seconds : 시간 지정 (CheckImage 설정에 따름)
; fromX , fromY , toX , toY : 이미지 서치 범위 지정
; 리턴값 : 1 = 이미지 찾음 , 0 = 이미지 못찾음, -1 = 이미지 파일 없음
ClickImage(img, seconds=0, fromX=0, fromY=0, toX=0, toY=0) {
    Sleep, 10

    result := CheckImage( img, seconds, x, y, fromX, fromY, toX, toY)
    If (result = 1)
    {
        px:=x-winX-WindowBorderWidth  ;;370 확인
        py:=y-winY ;-WindowBorderHeight-WindowCaptionHeight      ;;295 수동으로 맞춤
        msgbox, x:%x%, y:%y%, winx:%winx%, winy:%winy%, WindowCaptionHeight:%WindowCaptionHeight%, WindowBorderWidth:%WindowBorderWidth%, WindowBorderHeight:%WindowBorderHeight%, clientx:%px%, clienty:%py%


        p := px|py<<16

        If ( DebugMode = 1)
        {
            ;ToolTip, 이미지 클릭 %img%, x, y, 10
        }
  
        PostMessage, 0x200, 0, px|py<<16, , %ActiveID%
        ;PostMessage, 0x200, 0, %p%, , %ActiveID%   ;마우스 이동안됨
        ;PostMessage, 0x201, 1, %p%, , %ActiveID%   ;마우스 누르기 안됨
  ;PostMessage, 0x202, 0, %p%, , %ActiveID%   ;마우스 뗴기 안됨

    }

    Sleep, 200
    Return result
}





[좌표]

gATbcfM.png


[spy ]

Vx1sWC5.png


[메시지출력]

RdHr9oj.png





  • 리체 2016.06.24 20:01

    연구를 많이 하신것 같군요.

    윈도우 인포에서 보여지는 것만으로도 잘못된 점을 아실수 있는데 간과하신점이 아쉽습니다.

    x축-보더값은 8로서 x값에서 8을 빼주면 맞지만 y축-캡션,보더값은 둘다 0 입니다.

    그럼 답은 나왔지요?

    y축값에서 캡션과 보더값은 빼지 않으면 됩니다.

    그런데 찾은 이미지의 좌상값이므로 그 지점을 직접 클릭해보세요. 해당 전체 이미지의 살짝 안쪽이라면 상관없겠으나

    너무 끝쪽이라면 클릭이 되지 않을수도 있습니다.


    그리고 마우스 이동이 안된다고 느끼시는건 코드도 살짝 틀렸지만

    해당 윈도우에서 내부적으로 이동하는 것이기 때문에 실제 사용중인 마우스 커서의 이동은 없습니다.

    ; 0x200, 1, ~ (0으로 했을시 유틸에 따라 먹히지 않을수도 있습니다)



    노력이 엿보이는 질문이라서 잘못된 점을 추가로 알려 드립니다.

    공개된 코드중 자신이 쓰던 유틸(대부분 에뮬이겠지요?)을 상대할때 에러가 없다는 판단하에 올린것이겠지만

    세부적으로 따지면 틀린점들이 한두군데씩 보입니다.

    그러므로 정확히 이해하시고 사용하는게 나중을 위해서라도 좋습니다.


    SysGet, WindowCaptionHeight, 4 ; 캡션Height

    SysGet, WindowBorderWidth, 32 ; 보더Width
    SysGet, WindowBorderHeight, 33 ; 보더Height


    위에서 SysGet으로 보더 캡션값을 구했지만 이 값은 무엇을 근거로 나온 값일까요?


    이 값은 윈도우즈의 시스템값일뿐 유틸에서 해당값을 바꿔 버렸다면 사용해선 안되는 값입니다.



    P.S 그럼, 어떻게 해야 해당 윈도우의 정확한 값을 알아낼까요?

    .

    .

    .

    .

    .

    .

    .

    .

    .

    .

    .

    .

    답은 다음 기회에....

    고민해보시기 바랍니다. 어렵지 않습니다.


    아아..참...갠적으로 닉네임은 맘에 들지 않습니다 -_-;;

  • 왕초보이에으 2016.06.24 22:39

    답변 감사합니다^^

    여러 블로그 및 사이트에서 배우고는 있는데 질문글은 여기가처음이네요..그만큼 커뮤니티가 활발한것 도 있구요 ㅎㅎ



    우선 spy를 보고는 알아채지못했습니다. 대부분의 소스와 질문글에서 캡션과 보더값을 빼는것을 보아서

    잘못된것이라 생각하지 못했었거든요.



    계속 소스를 와따가따하면서 메시지박스로 변수를 찍어보다 이상하다 싶어서 수기로 계산해 보니 세로값이 안맞더라구요

    그래서



    py:=y-winY ;-WindowBorderHeight-WindowCaptionHeight      ;;295 수동으로 맞춤    위 소스처럼

                      이부분을 주석처리했습니다.ㅎㅎㅎ 295값을 맞추기위해서..그러다보니 캡션과보더값이없다는 걸 알게되었구요



    답변 주신것처럼 마우스이동   PostMessage, 0x200  을 눈으로 확인할수없다는 것도 몰랐습니다.

    클릭은 왜안되는지...휴


    문제 내주신것은 좀...생각을 해보겠습니다.

    꼼수로..위의소스는 winmove로 x는 0 - boder, y는 0 으로 옮기면 screen과 client 좌표가 같게..


    다른 에뮬 적용시는

    spy로 absolute-relative로 윈도우과 0.0사이의 값

             relative-client 값으로 보더와 캡션값을 알아낸 후 16진수로 변환할 값 계산..

     (솔직히 잘 모르겠습니다..)

    좌표계산도 이해가 안되니 클릭이 왜 안되는지도 못 찾겠네요..


    근데 닉네임이 맘에 안드시나요? ㅠㅠ     

  • 리체 2016.06.24 23:27

    유틸이나 컨트롤에 따라 포스트메시지로 클릭이 되지 않는것도 있습니다.
    그러므로 반드시 코드가 잘못되었다고 생각하지 마십시요.
    포스트메시지에 컨트롤을 추가해보시고 안된다면(컨트롤에 따라 좌표를 독립적으로 생각하여야 할수도 있습니다.)
    ControlClick으로 해보세요.(여기도 컨트롤이 들어갈수도 안들어갈수도 있습니다.)

    이것도 안먹힌다면 해당 컨트롤이나 유틸은 비활성으로 클릭할수 없다고 판단하시면 됩니다.

    녹스를 대상으로 하신다고 했으니 녹스에서 해보세요.
    녹스 클라이언트 부분에선 클릭 안되는곳은 없습니다.

    닉네임은 초딩틱해서요. ㅎㅎㅎ;;;

  • 슉슉이 2016.06.24 23:19

    녹스에 적용할 예정이면 녹스에서 바로 작업하시는 게 좋을 것 같습니다.


    녹스는 보더랑 캡션이 없습니다. 보더처럼 보이는 것은 사실 클리이언트 창을 나눠서 나타낸 것 같고요. 그렇기 때문에 녹스는 보더와 캡션 보정이 필요없습니다.


    타이틀 지정도 주의하셔야합니다. 초기상태의 녹스창과 옆의 기능키창이 이름이 같습니다. 그래서 그냥 타이틀을 지정하면 면 중복타이틀 우선순위로 기능키가 지정됩니다. 그러니 반드시 멀티매니저로 타이틀을 다른 이름으로 바꾸어주어야합니다.


    마지막으로 녹스창을 DC캡쳐하기 위해선 그래픽모드를 스피드모드로 해야합니다.


    녹스 타이틀이 Nox1이라고 가정하고 (100,100,200,200)드래그는 다음과 같습니다. 드래그의 경우 정확한 드래그를 위해선 별도의 처리가 필요합니다. 녹스를 하나만 쓸 경우 Nox1대신 ahk_class Qt5QWindowIcon을 써도 됩니다. 


    d1:= 100|100<<16 ;여기서

    d2:= 200|200<<16 ;여기까지

    PostMessage,0x201,1,%d1%,,Nox1

    sleep, 200

    PostMessage,0x200,0,%d2%,,Nox1

    sleep, 500

    PostMessage,0x202,0,%d2%,,Nox1

    sleep, 200


    (100,100)클릭은 다음과 같습니다.

    c := 100|100<<16

    PostMessage, 0x201, 1, %c%, , Nox1

    PostMessage, 0x202, 0, %c%, , Nox1

    Sleep, 300

  • 왕초보이에으 2016.06.30 09:40

    두분 덕에 해결했습니다!!! 감사합니다~~(__)


List of Articles
분류 제목 글쓴이 최근변경 추천
질문 폴더 가상화 문의 드려요.. 그까이꺼 2016.07.02 0/0
공유 postmessage 문자열 입력함수 모닝커피 2016.07.02 0/0
질문 브라우저에 비활성화 매크로 가능한가요? 1 장구김 2016.07.09 0/0
질문 공부중인데 ... 포스트메세지에서 5 섬머워 2016.07.09 0/0
질문 gdip 비활성서치 질문드립니다. 3 영창이염 2016.07.04 0/0
질문 이미지 서칭 클릭 좌표 어떻게 설정해야할까요? 4 bleuG 2016.07.09 0/0
질문 블루스택 완전히 종료시키는 명령어좀 부탁드립니당(무... 3 welchs 2016.07.04 0/0
자유 요새 오토핫키로 매크로 만드는 재미에 빠졌어요 3 퓨쥬 2016.08.07 0/0
질문 ahk 윈도부팅시 자동실행되게 시작등록했을때.. 3 검정다람쥐 2016.06.27 0/0
질문 autohotkey unicode 32-bit의 작동이 중지되었습니다 6 땀꾸루즈 2016.07.02 0/0
정보 소개 : CJon class 1 와이로 2016.06.26 2/0
질문 postmessage 명령 질문입니다. 5 왕초보이에으 2016.06.30 0/0
질문 비활성클릭 질문 5 왜6자냐 2016.06.25 0/0
질문 ADB드래그 혹시 명령어 다시한번만 봐주세요 ~ 4 제발등업좀2 2016.07.02 0/0
질문 비활성 이미지서칭 문제..질문입니다. 4 파르페틱 2016.06.22 0/0
질문 루프문 세개를 돌리고싶은데요 1 감성폭발 2016.06.21 0/0
질문 Gdip이미지 서치하고 싶은데 인식이 안됩니다 13 가족오락관 2016.06.25 0/0
질문 ADB (몽키) 클릭 및 드래그관련 ... 5 제발등업좀2 2016.07.02 0/0
질문 비활성화 질문+디버깅 영상 추가(T7GG님 코딩) 6 bleuG 2016.06.26 0/0
질문 오토핫키 멀티쓰레드(?) 3 다홍이 2016.06.20 0/0
Board Pagination Prev 1 ... 114115116117118119120121122 ... 209 Next
/ 209

전체 최신 인기글

전체 주간 인기글