자동화는 오토핫키가 가장 특화한 영역입니다. 많은 분들이 오토핫키에 발을 들이는 이유이기도하지요.

이 글을 읽고나면 업무자동화 등 반복적인 작업을 자동화하는 프로그램은 직접 제작하실수있습니다.

 

시작하기 전에

 

오토핫키에 아직 미숙하신 분여기를 클릭해 소스코드 생성과 컴파일방법을 확인하세요.

ㅡ 이 글은 반복적인 작업자동화 프로그램 제작 강의글입니다.

ㅡ 소스코드 작성에 필요한 모든 명령어,문법 등을 다룹니다. 따라서, 방대한 글이 될 것입니다.

ㅡ AutoHotkey_L 1.1.19.1 유니코드 버전에서 작성했습니다. 설치는 여기를 클릭하세요

ㅡ 오토핫키 공식에디터 Scite4AutoHotkey 를 사용합니다. 설치는 여기를 클릭하세요

 

 

사용할 명령어 필수인것은 '필수' 알아두면 도움이 되는것은 '옵션'으로 표기합니다

 

  • ㅡ [필수] HotKey 지정문법
  • ㅡ [필수] Send / SendPlay / SendInput / SendMode
  • ㅡ [필수] Click / MouseClick / CoordMode
  • ㅡ [필수] Sleep
  • ㅡ [필수] Loop / Break / Continue
  • ㅡ [필수] If / Else / 변수 표현식
  • ㅡ [옵션] ImageSearch / PixelSearch
  • ㅡ [옵션] ControlSend / ControlClick
  • ㅡ [옵션] Run / RunWait
  • ㅡ [옵션] SetTimer / Critical
  • ㅡ [옵션] WinActivate / WinWaitActive
  • ㅡ [옵션] Gui 문법 / MsgBox / Reload 문법
  • ㅡ [옵션] 자세한 Expression / 연산자 / 변수 문법
  • ㅡ [옵션] SingleInstance / 스크립트 설정 문법
  • ㅡ [옵션] Object / Array 문법
  • ㅡ [옵션] ActiveX 문법 / 웹 자동화

 

 

필수 명령어

 

1. HotKey 지정문법

HotKey 핫키 는 키보드 키 또는 키조합입니다. 핫키를 설정한 다음에 핫키를 누름으로써 특정액션을 취하게 설정할 수 있습니다.

 

A::
MsgBox, A키 눌렀네
Return ; 여기까지 실행하고 끝낸다

 

※ 세미콜론 ; 는 주석으로 일종의 코멘트입니다. ; 이후의 말은 코드실행에 아무런 영향을 주지않습니다.

위 소스코드를 적고, 실행해보세요. 키보드 A(한글 ㅁ)키를 누르면 "A키 눌렀네" 라는 메시지박스가 나옵니다.

 

 

HotKey 정리

따라서, 핫키를 지정하고 사용하는 방법은 아래와 같습니다.

 

핫키지정::

핫키를 눌렀을시 실행할 명령어

Return

 

추가로, 핫키지정은 'A' 처럼 단독 키뿐만아니라 컨트롤(Ctrl), 알트(Alt), 키와 조합이 가능합니다.

ㅡ 컨트롤(Ctrl) 키는 ^ 로 표현하고

ㅡ 알트(Alt) 키는 ! 로 표현합니다

 

^A::
MsgBox, 컨트롤 + A 키를 눌렀네요
Return
!A::
MsgBox, 알트 + A키를 눌렀네요
Return

 

 

2. Send / SendPlay / SendInput / SendMode

Send 는 키보드입력을 보내는 명령어입니다.

SendPlay 는 게임키입력에 최적화되어있는 Send명령어입니다. (한글입력 불가)

SendInput 은 Send보다 빠르고 안정적인 Send입니다.

 

!X::
Send, 이것이 Send명령어입니다 {Enter} ; 이것이 Send명령어입니다 입력후 엔터
SendPlay, This is SendPlay {Enter} ; This is SendPlay 입력후 엔터
SendInput, 이것은 SendInput {Enter} ; 이것은 SendInput 입력후 엔터
return

 

 

위 소스코드에서 확인할수있듯이,

엔터와 같은 키보드 자체의 키를 표현하기 위해서는 { } 괄호를 사용해야합니다.

Enter 로 적으면 엔터키가 아니라 "Enter" 라는 문자를 적겠죠.

따라서 컨트롤키는 {Ctrl}, 알트키는 {Alt}, 스페이스바는 {Space}, Esc는 {Esc}, Home 키는 {Home}, PgUp키는 {PgUp} 등으로 표시해야합니다.

 

Send와 SendPlay 그리고 SendInput 등 따로따로 적어서 사용할수도 있지만

SendMode, 사용할모드 를 적어주면 Send로도 Send사용모드 로 자동변환되어 사용할 수 있습니다.

아래 코드를 확인하죠

 

SendMode, Input  ; 모든 Send명령어를 SendInput 방식으로 변환한다
!X::
Send, {a}  ; SendInput, {a} 와 동일한 성능을 구현합니다.
Send, {A}

return

 

추가로, 위 코드의 결과에서 {a} 와 {A} 가 어떻게 다른지 확인이 가능하죠?

Send, {a} 는 소문자 a를 입력하고

Send, {A} 는 대문자 A를 입력합니다.

 

Send 정리

따라서, Send는 아래의 예처럼 사용합니다.

 

SendMode, Input  ; 모든 Send명령어를 SendInput 방식으로 변환한다
!X::
Send, 입력할 문자/문자열
Send, {입력할 키}
return

 

 

3. Click / MouseClick / CoordMode

두 명령어 둘다 마우스클릭을 합니다.그러나 Click이 MouseClick 보다 간단해서 더 자주 사용합니다.

 

Click 

현재 마우스커서 위치에서 마우스왼쪽버튼 클릭

Click 44,55 

컴퓨터화면 x좌표 44 y좌표 55 지점을 마우스 왼쪽클릭 

Click Right 44, 55

컴퓨터화면 x좌표 44 y좌표 55 지점을 마우스 오른쪽클릭 

Click 2

현재 마우스커서 위치 마우스왼쪽버튼 2번 클릭 

Click Down 

마우스 왼쪽 버튼을 누르고 있는다.

Click Up Right 

마우스 오른쪽 버튼을 뗀다.

Click %변수1%, %변수2%

컴퓨터화면 x좌표 변수1, y좌표 변수2를 마우스 왼쪽클릭 

 

Click 명령어에서 사용되는 X좌표와 Y좌표는 CoordMode 좌표설정명령어의 영향을 받습니다.

따로 CoordMode 명령어를 명시하지않을시, Screen 좌표로 설정됩니다.

가능한 Screen 좌표는 사용하지않는것이 좋습니다. 밑으로 내려가면서 이유를 설명하죠

 

Screen 좌표는 컴퓨터 전체화면에서의 좌표를 뜻합니다.

컴퓨터 해상도 1920 * 1080 의 경우 화면 왼쪽 맨위에서부터 0,0으로 좌표는 시작됩니다.

오른쪽으로 갈수록, X좌표값이 증가하고

아래로 내려갈수록, Y좌표값이 증가합니다.

그러므로, 화면 오른쪽 맨아래의 좌표는 1920, 1080 이 됩니다.

 

정확한 좌표를 확인하기 위하여 오토핫키 설치시 제공되는 프로그램을 이용해보겠습니다.

본인 컴퓨터의 오토핫키 설치폴더로 가면 'AU3_Spy.exe' 이라는 파일이 있습니다, 실행하세요.

 

 

실행하고, 바탕화면 빈공간을 클릭해보세요.

 

 

사진의 빨간색으로 표시한 부분에서

Absolute, Relative 그리고 Client 가 보이시나요?

 

Absolute 는 Screen 좌표를 뜻합니다. = 컴퓨터의 전체화면에서의 좌표

Relative 는 활성창의 좌표를 뜻합니다.= 활성창의 좌표, 현재는 활성창이 바탕화면

Client 는 활성창의 작업창(최소호,최대화,닫기)를 제외한 좌표를 뜻합니다. = 사용빈도 X

 

위에서 Screen 좌표를 사용을 최대한 지양하라 했습니다.

그 이유의 예로는,

스크린 좌표를 이용해서 프로그램 내의 특정부분을 클릭하게 만든 경우

프로그램의 위치를 이동하면 엉뚱한 부분을 클릭하기 떄문입니다.

위 사진은 활성창이 바탕화면이기 때문에 Screen좌표와 Relative 활성창좌표가 동일한것일뿐

 

따라서 무조건 프로그램 자체내의 좌표, =활성창 좌표 Relative 를 이용하는 것이 좋습니다.

활성창좌표는 창을 기준으로 (0, 0) ~ (창크기X좌표, 창크기Y좌표) 로 되어있겠네요.

 

한번 활성창좌표와 Click 을 사용하여 에디터창의 스크립트실행 버튼을 눌러보도록 하겠습니다.

 

 

에디터 Sctie4AutoHotkey 의 스크립트시작 버튼의 Relative 좌표를 확인해야겠죠?

X좌표 397, Y좌표 64이네요.

 

또한 소스코드에 Click 명령어가 클릭하는 좌표가 활성창좌표라는 것을 명시해야합니다.

CoordMode, Relative 로 적어두면 소스코드에 표기하는 모든 좌표를 활성창 기준으로 잡습니다.

 

CoordMode, Relative  ; 좌표모드를 Relative 활성창 기준으로
!X::
Click 397,64 ; 활성창 397, 64 좌표를 클릭
return

 

실행결과는 예상한대로입니다. 시작버튼을 클릭하네요!

그런데 스크립트를 실행시킨상태에서 또 다시 시작버튼을 누르면 아래와 같은 확인메시지가 출력됩니다.

 

 

이미 스크립트가 실행되고 있으므로, 새로 실행할 것인지 묻는 메시지군요

'예' 를 누르면 새로실행할것이고, '아니요'는 새로실행하지 않습니다.

위 메시지와 관련한 모든부분은 [옵션]의 SingleInstance / Reload 부분에서 다룹니다.

 

Click 정리

따라서, Click 명령어는 아래의 예처럼 사용합니다.

 

CoordMode, Relative  ; 모든 좌표를 활성창으로 설정한다
!X::
Click, x좌표, y좌표 ; 활성창 x좌표 y좌표 클릭
return

 

 

4. Sleep

키보드, 마우스입력을 했다가 잠시쉬고 다시 입력을 보내고 싶으시죠?

잠시 쉬는것이 'Sleep' 명령어입니다.

 

SendMode, Input
!X::
Send, 안  ; '안' 입력
Sleep, 3000 ; 3000 밀리세컨드 즉, 3초동안 쉰다
Send, 녕 ; '녕' 입력
return

 

밀리세컨드로 시간을 표기해야하므로, 1초는 1000 이 되고, 5.5초는 5500 이 되겠습니다.

 

Sleep 정리

따라서, Sleep 명령어는 아래의 예처럼 사용합니다.

 

핫키지정::
명령어 1
Sleep, 밀리세컨드
명령어 2
Sleep, 밀리세컨드
명령어 3
명령어 4
Sleep, 밀리세컨드
return

 

 

5. Loop / Break / Continue

Loop는 반복문입니다. Break와 Continue는 반복문을 제어하는 명령어이구요.

 

A키를 반복적으로 입력하거나, 오토마우스 처럼 한 위치를 계속해서 클릭하고 싶을때 Loop를 사용합니다.

설마 아래처럼 하시는 분은 없겠죠...

 

!X::
Send, A
Send, A
Send, A
Send, A
Send, A
return

 

Loop를 이용하면 아래처럼 소스를 작성할 수 있습니다.

 

!X::
Loop, 5   ; 괄호안의 명령어를 5번만큼 반복한다
{
 Send, A
}
return

 

Loop명령어는 폴더개수, 특정 확장자 파일의 개수와 모든이름을 구하는등 다양한 활용이 가능하지만

이 글에서는 명령어반복만을 강의하도록 하겠습니다.

 

계속해서 진행하죠

 

!X::
Loop, 5
{
 Send, 안녕하세요 {Enter}
}
MsgBox, 끝났네요
return 

 

위 코드의 실행결과가 어떨지 예상이 되시나요?

 

Loop 괄호 { } 안의 명령어를 5번만큼 반복하고, 괄호밖을 나오게되는데

괄호 밖의 MsgBox 명령어를 만나 '끝났네요' 라는 메시지를 띄우고 return을 만나 끝납니다.

 

반복할 횟수를 생략한다면 무한반복이 됩니다.

 

!X::
Loop
{
 MsgBox, 이 창은 계속 뜹니다
}
return

 

무한반복을 종료하는 방법으로 Break 를 이용합니다.

그전에 먼저 A_Index 라는 오토핫키의 반복문 내장변수에 대해 짚고 넘어가겠습니다.

 

A_index (대소문자 구별X) 은 반복문이 몇번째로 실행중인지 카운트해주는 내장변수입니다.

내장변수 = 자체적으로 값이 설정되는 변수

 

!X::
Loop
{
 MsgBox, % A_Index
 if (A_Index = 5)
  break
}
MsgBox, 5번 실행하고 나왔네요
return

 

위 코드의 결과는 아래와 같습니다

 

 

 MsgBox % A_Index
 if (A_Index = 5)
  break

 

이 부분을 설명해보겠습니다, A_Index 는 반복문의 실행횟수를 저장하는 변수라고 했습니다.

그 변수를 메시지박스로 표현하려면 % 퍼센트 표시를 붙여줘야합니다.

% 없이 적는다면 "A_Index" 라는 글자를 보여주기 때문이죠.

% 표기를 함으로써, 문자나 숫자가 아닌 변수의 저장된 값을 불러옵니다.

 

MsgBox, A_Index  ; A_Index 라는 글자를 띄움
MsgBox, % A_Index  ; 반복문 횟수를 표현
MsgBox, %A_Index%  ; 반복문 횟수를 표현

 

% 하나와 % % 두개에 대한 자세한 설명은 이후의 [필수] 변수 표현식 에서 설명합니다.

 

다음으로 If (A_Index = 5)

If (A_Index = 5) 는 보기만해도 대충 짐작이 가시죠?

A_Index 변수의 값이 5가 될때 다음 명령어를 진행합니다.

 

다음 명령어는 Break 네요,

반복문을 탈출하는 Break는 Loop 괄호밖으로 빠져나갑니다.

Loop 괄호밖에는 '5번 실행하고 나왔네요' 라는 메시지박스가 있네요.

그러므로, 코드의 결과는 위 이미지와 동일합니다.

 

Break 명령어는 가장 가까운 Loop { } 괄호를 빠져나갑니다.

현재의 { } 괄호를 탈출하는것이죠.

무슨 말인지 다음 코드에서 확인해보세요

 

 !X::
Loop
{
    Loop
    {
        MsgBox, 처음실행
        break
    }
    MsgBox,  새끼 루프 탈출
    break
}
MsgBox, 외곽 루프 탈출
return

 

좀 복잡하신가요? ㅎㅎ

실행결과를 보시면 이해가 쉬울거에요

 

 

알고리즘을 순서대로 적어보겠습니다.

0. 알트 + X 핫키를 누르면

1. '처음실행' 메시지박스 출력

2. Break 명령어로 현재의 괄호(= 가장 가까운 Loop) 탈출

2. 괄호밖의 '새끼 루프 탈출' 메시지박스 출력

4. 2번째 Break 명령어로 현재의 괄호 (= 가장 가까운 Loop) 탈출

5. 괄호밖의 '외곽 루프 탈출' 메시지박스 출력

6. return 을 만나 종료

 

그럼 Continue 는 Break 와 다른점이 무엇일까요?

차이점은

Break는 괄호를 탈출시켜서 Loop 반복문을 끝낼수있지만

Continue 는 괄호의 끝으로 가 Loop 반복문을 다시 반복합니다. 즉, 끝나지않습니다.

 

Continue 예제를 하나 확인하겠습니다

 

!X::
Loop, 10
{
    if (A_Index < 5)
        continue
    MsgBox, % A_Index
} ; Continue 는 바로 여기로 이동
return

 

코드를 실행해보면,

메시지박스가 5,6,7,8,9,10 을 차례대로 출력됩니다.

 

A_index, 루프 반복이 5번 미만일때는 Continue 명령어때문에  } 로 이동합니다. 탈출하는것이아닙니다.

그리고 다시 A_Index 값 확인, 5미만이면 } 로 이동, 5이상이면 메시지박스 출력.

루프 횟수를 10으로 설정했으니 이러한 과정을 10번만 거치게됩니다.

 

Loop / Break / Continue 정리

따라서, 반복문과 반복문 탈출은 아래의 예처럼 합니다.

 

!X::
Loop, 횟수, 생략시 무한반복
{
    명령어
    break ;반복문 탈출
}
MsgBox, 반복문 탈출했네요
return

 

 

6. If / Else / 변수와 표현식

If 와 Else 는 조건식입니다. 위에서 간단한 예시로 확인해봤고 실제로도 쓰임은 전혀 복잡하지 않습니다.

A_Index 라는 변수에 대해서도 잠깐 훑어보았는데,

이 챕터에서 조건식과 ,변수, 그리고 이 모든것을 사용하기위한 표현식에 대해서 자세히 배워보도록 하겠습니다.

 

Age = 20     ; Age 라는 변수에 숫자 20을 저장한다
MsgBox, % Age

 

'Age = 20' 이 보이시죠?

주석의 설명대로 Age 라는 변수에 숫자 20을 저장하는겁니다.

 

오토핫키에서 변수는 자료형(데이터의 타입) 을 명시할 필요가 없습니다.

굉장히 편리하죠 C언어는 변수마다 각각 지정해줘야 하는 번거로움이 있는데 말입니다.

 

한가지 중요한점. 변수명은 오토핫키의 명령어나 내장변수(A_index 등) 으로 설정하면 안됩니다.

 

따라서, 변수는 이렇게 지정하는거군요!

 

변수명 = 변수에 저장할 값
Height = 180   ; Height 라는 변수에 숫자 180을 저장
Gender = 남자   ; Gender 라는 변수에 '남자' 라는 문자열을 저장

 

변수1에 변수2의 값을 저장하고 싶다면 어떻게 코드를 작성해야 할까요.

'변수1 = 변수2' 로 하니 '변수1'에는 변수2 라는 문자열이 저장됩니다.

아까 % 표기를 했다는것을 기억하시나요? 여기서도 동일한 문법이 적용됩니다.

 

Age1 = 20                  ; Age1 라는 변수에 숫자 20을 저장
Age2 = %Age1%        ; Age2 라는 변수에 변수 Age1(숫자20)을 대입 
Age3 = Age1             ; Age2 라는 변수에 Age1 이라는 문자 저장

 

위 변수의 표현식은 트레디셔널 이라고 부릅니다. 

표현식엔 종류가 2가지 있는데요. 한가지가 지금 설명한 트레디셔널, 두번째는 익스프레션 입니다.

 

If 조건식과 앞으로 오토핫키를 깊이있게 사용할 생각이 있으시다면,

가능한 표현식은 익스프레션으로 사용하는것이 좋습니다.

이유는 If 조건식과 대부분의 '~식'들이 익스프레션을 사용하기 때문인데요

 

그러면 익스프레션을 또 배워야 하나? 머리아픈데..

아닙니다. 트레디셔널과 정말 비슷합니다 간단해요.

 

Age1 := 20             ;Age1 에 숫자 20을 저장
Age2 := Age1         ;Age2 에 변수 Age1 을 대입
Gender := "남자"   ; Gender라는 변수에 '남자' 문자열 저장 

 

= 대신에 := 을 쓰고, 변수를 대입할 때 % % 표시를 하지않네요.

중요한점은 문자를 저장할때는 " " 따옴표처리를 해야한다는것입니다.

 

그러면 정리하겠습니다.

결국 (익스프레션) 변수는 이렇게 사용하는군요.

 

변수명 := 저장할 숫자
변수명 := "저장할 문자"
변수명 := 대입할 변수명

 

숫자변수끼리는 서로 값을 연산할수도 있습니다.

 

변수명 := 변수명1 + 변수명2       ; 변수명1 과 변수명2를 더한 값을 변수명에 저장
변수명 := 변수명1 - 변수명2       ; 뺀 값을 저장
변수명 := 변수명1 * 변수명2       ; 곱한 값을 저장
변수명 := 변수명1 / 변수명2       ; 나눈 값을 저장

 

문자변수끼리는 문자를 누적이 가능합니다.

 

Apple := "사과"              ; Apple 이라는 변수에 문자 사과 를 저장
Juice := "주스"              ; Juice 이라는 변수에 문자 주스 를 저장
Total := Apple . Juice      ; Total 이라는 변수에 변수 Apple과 변수 Juice 의 값을 누적
MsgBox % Total           ; 사과주스 라는 문자가 출력된다

 

이제 그럼 If , Else 와 연관지어 공부해보겠습니다.

 

Apple := 700
Juice := 300
내야할돈 := Apple + Juice                 ;내야할돈 이라는 변수에 Apple변수와 Juice 변수의 더한값을 저장
가진돈 := 3000
거스름돈 := 가진돈 - 내야할돈           ;거스름돈 이라는 변수에 가진돈 변수에서 내야할돈 변수의 뺸값을 저장
if (내야할돈 > 가진돈)                        ; 만약 내야할돈 변수의 값이 가진돈 변수의 값보다 크다면
    MsgBox, 가진돈보다 비쌈              ; 가진돈보다 비쌈 메시지박스 출력
else if (내야할돈 < 가진돈)                ; 만약 내야할돈 변수의 값이 가진돈 변수의 값보다 작다면
    MsgBox, 거스름돈 %거스름돈% 원 남습니다         ; 거스름돈 계산한 메시지박스 출력
else                                                                  ; 그것도 아니라면 (=가진돈과 내야할돈이 같다면)
    MsgBox, 거스름돈 0원 남겠네                          ; 거스름돈은 0원 남겠군
return

 

실행결과는 짐작할수 있듯이,

 

 

If / Else / 변수와 표현식 정리

 

변수명1 := 저장할 값 또는 변수명
변수명2 := "저장할 문자"
if (조건식)
    조건식이 참일 경우 실행할 명령어 한개
else
    조건식이 거짓일 경우 실행할 명령어 한개
return
; 실행할 명령어가 2개 이상일 경우 { } 괄호로 묶어준다.
if (조건식)
{                  ; 조건식이 참일 경우 괄호의 명령어를 수행함
    첫번째 명령어
    두번째 명령어
    N번째 명령어
}
else               ; 조건식이 거짓일 경우 괄호의 명령어를 수행함
{                       
    첫번째 명령어
    두번째 명령어
    N번째 명령어
}
return

 

 

옵션 명령어

 

1. ImageSearch / PixelSearch

ImageSearch 는 화면에서 이미지를 찾는 명령어입니다. PixelSearch 는 픽셀(점)에서 색상을 찾고요.

이미지서치는 오토핫키에서 가장 핫한 명령어가 아닐까 생각하네요.

[옵션] 으로 분류하기는 했지만 사실상 필수라고 봐도 무방할 정도로 활용도가 높습니다.

 

이미지서치 사용하기위해서는 당연히 찾을 이미지, 즉 이미지파일이 필요하겠죠?

캡쳐뜨는 프로그램은 여러가지이니 원하는거 사용하시면 되겠습니다.

저의 경우 기본적으로 윈도우에 설치되어있는 그림판 을 사용합니다.

 

예로서, 이미지서치를 사용해 내 컴퓨터의 로컬 디스크를 클릭하는 코드를 짜보겠습니다.

내 컴퓨터 창을 캡쳐한다음 로컬 디스크 부분은 잘라야겠죠?

 

 

사각으로 선택해서~

 

 

저 부분만 자르겠습니다.

따라서 이미지는 아래사진과 같겠네요.

 

 

그리고 저 이미지파일을 저장합니다, 반드시 영어이름으로 저장합니다.

저는 'MyCom.png' 로 저장하겠습니다. 소스코드와 동일한 경로에 저장해두세요.

 

이제 코드를 살펴보죠

 

A::
ImageSearch, vx, vy, 0, 0, A_ScreenWidth, A_ScreenHeight, MyCom.png
if ErrorLevel = 0         ; 만약 이미지를 찾았을 경우에는 괄호의 명령어를 수행
{
    Click %vx%, %vy%         ; 이미지찾은 위치 X좌표 Y좌표 클릭
    MsgBox, 찾음                ; 찾음 메시지박스 출력
}
else if ErrorLevel = 1           ; 만약 이미지를 못찾았을 경우에는
    MsgBox, 못찾음             ; 못찾음 메시지박스 출력
return                               ; 여기까지 수행하고 종료

 

A키를 누르면 화면에서 소스파일의 경로의 'MyCom.png' 이미지파일을 찾습니다.

 

그런데 이미지를 찾았는지 못찾았는지 확인을 해야하지않습니까?

그것을 확인할수있는것이 ErrorLevel 내장변수입니다.

이미지파일을 찾았을 경우에는 에러레벨이 0 이 되고, 못찾았을 경우에는 1 이 됩니다.

2로 될때는 이미지파일이 경로에 없어 불러들이지 못하는 경우입니다.

 

MyCom 이미지파일의 전체경로를 적어야하지만, 이미지가 소스코드파일과 같은 경로에있을경우는

앞 경로를 삭제하고 이미지파일명.확장자 만 적어줘도 무방합니다. 위 코드처럼요.

 

간략한 설명을 했으니 이제 이미지서치에 대해 자세히 알아보겠습니다.

 

ImageSearch, 찾은X위치, 찾은Y위치, 시작X, 시작Y, 지점X, 지점Y, 이미지파일경로\이미지파일명.확장자

 

찾은위치X, Y에는 이미지파일의 X,Y좌표가 저장되는 변수입니다. CoordMode 의 영향을 받습니다.

변수명X, 변수명Y 로 적어줘야합니다. 저장이 필요없다면 그냥 생략하고 , 로 넘길수있습니다.

 

시작X, Y 에는 이미지파일을 서칭을 시작할 X,Y좌표를 적습니다. CoordMode 의 영향을 받습니다.

지점X, Y 에는 이미지파일을 서칭을 끝낼 X,Y 좌표를 적습니다. CoordMode 의 영향을 받습니다.

 

시작좌표와 끝 지점좌표를 잘 명시해주면

이미지서치에 걸리는 시간과, 경우에 따라 발생하는 렉을 방지할 수 있습니다만

좌표 구하기가 귀찮기 때문에, 그냥 전체화면에서 찾는게 편합니다.

 

ImageSearch, 찾은X위치, 찾은Y위치, 0, 0, A_ScreenWidth, A_ScreenHeight, 이미지파일경로\이미지파일명.확장자

 

좌표 (0,0) 부터 (A_ScreenWidth, A_ScreenHeight) 까지가 전체화면입니다.

 

A_ScreenWidth, A_ScreenHeight 는

앞서말한 A_index 처럼 내장변수 (= 자체적으로 값이 설정되는 변수) 입니다

 

무엇으로 설정되냐구요?

A_ScreenWidth 는 컴퓨터해상도 X좌표

A_ScreenHeight 는 컴퓨터 해상도 Y좌표 가 되겠습니다.

 

해상도가 1920, 1080 인 컴퓨터의 경우에 A_ScreenWidth 는 1920, A_ScreenHeight 는 1080이 되겠네요.

 

작성중입니다.

  1. 이전 댓글 더보기
  2. 2015.12.13 00:10

    비밀댓글입니다

  3. 2015.12.13 08:25

    비밀댓글입니다

  4. 벚길 2015.12.28 16:59 신고

    저 이미지 서치 부분에서 소스코드 파일경로와 이미지 경로를 같게해도 계속 못찾음이라고 뜨는데 무슨 문제인가요?

  5. 진짜 2015.12.31 15:54 신고

    이렇게 이해하기 쉽다니 놀랍습니다.

  6. Settimer 2016.01.03 06:37 신고

     안녕하세요.

    요즘 settimer를 이용해서 프로그램을 짜고 있는데요.

    settimer 문장을 한번만 실행하고 다음부터는 실행을 하지않습니다.

    도저히 해결이 되지 않아 질문을 해볼까합니다.

    도와주시면 감사하겠습니다. ㅠ.ㅠ

    ↓밑에 소스를 간단히 적었구요.

    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━




    시작:

    {








    내용~~




    goto,검색







    }

    return







    검색:

    {


    {

    시간 := 딜레이*6000
    SetTimer, 휴식, %시간%

    (return) ;;;; [return]을 넣으면 휴식이라는 문장은 잘되는데 [return]밑에 내용은 실행이 되지않습니다.

    왜그러는 걸까요?

    }




    loop

    {


    pixelgetcolor,~~~~~~~~~~

    지정한 좌표에 색값이 달라지면

    {




    goto,확인




    }







    }







    }

    return




    확인:

    {





    이미지서치 (이미지 발견 못함)

    {


    goto,검색

    }

    }

    return

    끝:

    {

    }

    return




    휴식:

    {


    내용

    }

    rerturn






















    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━

    • BlogIcon 예지력 2016.01.03 09:47 신고

      return은 서브루틴(함수,goto,gosub)를 끝내는 명령어니까요

  7. 2016.01.04 12:21

    비밀댓글입니다

  8. 123213 2016.01.07 16:42 신고

    센드, 한글입력시 한글이 입력안되고 꿻뚫 이런식으로 출력되는데 무슨문제일까요

  9. 오토핫키입문자 2016.01.07 19:44 신고

    안녕하세요 예지력님 글들을 꼼꼼히 읽어봤는데요 한가지 궁금증이 듭니다.
    한 키를 꾹 누르거나 또는 한 키를 지정된 시간(1초나 2초나 1.5초 등등) 동안만 누르게 하는 명령어는 없나요?
    Sleep은 조금 다른 개념같아요.. 찾아봐도 없는것 같아 질문글 올려봅니다.
    예를 들어서 스페이스키를 1.5초동안만 누르고 싶다 라고 하면 어떤 명령어를 사용해야 할까요?

  10. 안녕로봇 2016.01.10 19:27 신고

    엔터키를 누르는 명령어인데 메모장에선 잘 실행이되나
    게임안에서 엔터키 입력이안됩니다. 게임상에서 백스페이스 입력도 되는데 엔터키 입력은 안됩니다.
    샌드플레이로도 해보고 했는데 안되네요 어떻게해야할까요.

    그리고 위 예제처럼 이것은 sendinput을 출력하려고하면
    알파벳 sendinput이 출력이안되고
    이것은 ㄴ두야ㅞㅕㅅ 이런식으로 한글로 출력해버리는데 왜이럴까요

  11. 부르르갓 2016.02.01 00:03 신고

    특정 좌표 안에서만 이미지서치하게 하는 방법은 없나요?

  12. 235 2016.02.14 00:17 신고

    감사합니다 많은 도움이 됐습니다.

  13. 예지력님최고 2016.02.15 18:16 신고

    예지력형님 정말 궁금하면서 저의 브레인 으로썬 도무지 알 수 가 없는 질문 하나만 남겨봅니다.. 답글 주셨으면 가문의 영광이겠습니다..
    텍스트 파일 맨윗줄을 불러와 어느곳에 붙여넣기하고 그 붙여넣기한 맨윗줄 하나만 삭제하는 스크립트를 짜고싶습니다
    하지만 삭제 부분에서 막혀서 답답해죽겟습니다 한줄한줄 차례로 붙여넣기는 잘되는데 붙여넣기한 맨윗줄 하나 삭제가 안됩니다..
    도와주세요 ㅠㅠ 참고로 fileread,clipboard,txt.txt 문구를 사용하였습니다

  14. 네뷸라메크로사용자 2016.02.18 13:54 신고

    오토핫키 편집프로그램 SciTE4AutoHotkey 을 다운받아서
    네뷸라 메크로를 편집하려고그러는데
    프로그램을 연후

    AdventureHeroHandler()
    {
    if(IsImagePlus(clickX, clickY, "Image\Hero\Hero.bmp", 60, 0))
    {
    if(checkHero)
    {
    Click(clickX, clickY)
    AutoStrengthenHero()
    HeroAutoSelling()
    checkHero := 0
    if(IsImagePlus(clickX, clickY, "Image\Adventure\Start.bmp", 60, 0))
    Click(clickX, clickY)
    }

    이부분을 아래처럼 추가해서

    AdventureHeroHandler()
    {
    if(IsImagePlus(clickX, clickY, "Image\Hero\Hero.bmp", 60, 0))
    {
    if(checkHero)
    {
    Click(clickX, clickY)
    if(IsImagePlus(clickX, clickY, "Image\Hero\Hero-2.bmp", 60, 0))
    {
    Click(clickX, clickY)
    AutoStrengthenHero()
    HeroAutoSelling()
    checkHero := 0
    if(IsImagePlus(clickX, clickY, "Image\Adventure\Start.bmp", 60, 0))
    Click(clickX, clickY)
    }


    이런식으로 바꾸려고하는데요

    문제는 바꿧을때 프로그램이 아예 열리지 않습니다

    찾아보니 프로그램을 정상적으로 열려면 bite수를 맞춰줘야된다고 하는데 (변환전 = 변환후)

    이쪽으로 아예 문외한이라서 어떤방식으로 접근해야되는지 전혀 모르겠네요..

  15. 2016.02.21 14:01 신고

    Error: Error opening the destination file
    이건 어떻게 해야하나요;;

  16. 송아지 2016.03.04 10:51 신고

    죄송하지만 이미지서치기능말고 텍스트 서치기능은 없나요?

  17. Dante 2016.03.15 14:15 신고

    질문 있습니다. 예를들어 몬스터 이미지를 스샷찍어서 해놓으면 그 배경까지 적용이 되는겁니까?
    사소한 바닥 균열이라던가하는 것까지 적용이 되는 것입니까?

  18. Dante 2016.03.15 14:16 신고

    그냥 몬스터 자체의 이미지만 적용이 되는 것입니까?

  19. 시몬 2017.02.25 17:59 신고

    저는 자동 물약을 만들어 볼까 하는데요 ..이미지서치로 하려면 어떻게 응용해야 될지 모르겠어요 ..
    하나가 아니라 두개니까요 .. ㅠㅠ

  20. 바다새 2017.06.20 19:40 신고

    도스 시절 foxpro하고 클리퍼라는 프로그램하고 비슷한가봐요.

  21. 빨간달팽이 2017.12.14 21:32 신고

    정말 잘 보고있고 잘 배우고있습니다.
    혹시 글 작성을 멈추신건가요? 아니면 현재 진행중인건가요?

    • BlogIcon 예지력 2017.12.14 21:33 신고

      현재 좀 바빠서 잠시 멈춘 상태입니다 ㅜ

    • 빨간달팽이 2017.12.15 03:42 신고

      아아 그렇군요!
      천천히 기다리겠습니다 ㅋㅋㅋㅋ
      오토핫키를 처음 배우고있는데 여러군데에서 정보를 얻었었는데 예지력님이 해주시는 설명이 가장 이해하기 쉽고 편해서 매일 이용하고있습니다. 화이팅이에요!

+ Recent posts