오토핫키 초보자 자습서 작성 티드비트(tidbit)

목차

  1. 기본
    1. 오토핫키를 내려받아 설치하기
    2. 스크립트 만드는 법
    3. 명령어는 병합할 수 없다
    4. 도움말 파일 찾는 법
  2. 핫키 & 핫스트링
    1. 키와 그의 신비한 심볼
    2. 창 전용 핫키/핫스트링
    3. 파일당 다중 핫키/핫스트링
    4. 예제
  3. 키 눌림 전송하기
    1. 게임
  4. 프로그램 & 웹사이트 실행하기
  5. 명령어 vs. 함수
    1. 코드 블록
  6. 변수
    1. 퍼센트를 사용할 때
    2. 사용자 입력 얻기
    3. 다른 예제들?
  7. 객체
    1. 객체 만들기
    2. 객체 사용하기
  8. 기타 도움이 되는 것들
    1. The mysterious square brackets
    2. AHK 버전 알아내기
    3. 시행 착오
    4. 들여쓰기
    5. 도움 요청하기
    6. 기타 링크

1 - 기본 지식

여행을 시작하기 전에, 조언을 한 마디 할까 합니다. 이 자습서에서 여러분은 꽤 많은 텍스트와 코드를 보시게 됩니다. 배우는 힘을 키우려면, 텍스트를 읽고 코드를 시험해 봅니다. 다음 그 코드를 연구해 보시기 바랍니다. 이 페이지에서 대부분의 예제를 복사해 붙여 넣을 수 있습니다. 잘 모르겠다면, 다시 읽어 보십시오.

a. 오토핫키를 내려받아 설치하기

AutoHotkey (AHK)의 사용법을 배우기에 앞서, 내려 받아야 하겠습니다. 내려 받았으면, 설치해야 겠지요. 그러나 그것은 원하는 버전이 무엇인가에 따라 달라집니다. 이 지침서에서는 설치기를 사용하겠습니다. 가장 쉽게 설치할 수 있으니까요.

텍스트 지시:

  1. AutoHotkey 홈페이지로 갑니다: https://www.autohotkey.com/
  2. 내려받습니다: https://www.autohotkey.com/download/ahk-install.exe
  3. AutoHotkey를 설치하는 동안 UNICODE 또는 ANSI 중 하나를 골라야 합니다. 짧게 말해, 아마도 UNICODE를 선택하는 편이 좋습니다. 영문자-아닌 문자와 숫자들을 지원하거든요. 설치 버튼이 나올 때까지 계속 진행합니다.
  4. 일단 끝났으면, 성공입니다! 섹션 b에서 계속합니다.

For a video instruction, watch Install and Hello World on YouTube.

b. 스크립트 만드는 법

오토핫키를 설치했으면, 뭔가 일을 시키고 싶겠지요. 오토핫키가 마법은 아닙니다. 우리 모두가 그렇기를 바라지만, 실제로는 아닙니다. 그래서 무슨 일을 하라고 지시할 필요가 있습니다. 이런 절차를 "스크립팅(Scripting)"이라고 부릅니다.

텍스트 지시:

  1. 데스크탑에 우클릭합니다.
  2. 메뉴에서 "New"를 찾습니다.
  3. "New" 메뉴 안에 "AutoHotkey Script"를 클릭합니다.
  4. 스크립트에 새 이름을 줍니다. 확장자는 .ahk로 끝나야 합니다. 예를 들어: MyScript.ahk
  5. 데스크탑에 새로 만들어진 파일을 찾아 우클릭합니다.
  6. "Edit Script"를 클릭합니다.
  7. 창이 열릴 겁니다. 아마도 노트패드이겠지요. 그렇다면, 성공입니다!

    이제 스크립트를 만들었으므로, 파일 안에 내용을 채워 넣어야 하겠습니다. 모든 내장 명령어와 함수 그리고 변수 목록은 section 5에서 보실 수 있습니다.

    다음은 핫키를 담고 있는 아주 간단한 스크립트입니다. 그 핫키가 눌리면 Send 명령어를 사용하여 텍스트를 타자합니다:

    ^j::
    Send, 나의 첫 번째 스크립트
    return

    나중에 더 깊이 들어가 보겠습니다. 그 때까지, 여기에서는 위의 코드를 설명합니다:

  8. 파일을 저장합니다.
  9. 데스크탑의 그 파일을 더블클릭하여 실행합니다. 노트패드를 엽니다 (무엇이든 타자해 넣을 수 있습니다). 그리고 CtrlJ를 누릅니다.
  10. 멋지지요, 성공입니다! 첫 스크립트가 실행되었습니다. 가서 잠시 쉬고 돌아와 이 자습서를 계속 읽어보십시오..

For a video instruction, watch Install and Hello World on YouTube.

c. 명령어는 병합할 수 없다

코드를 만들 때, 여러 명령어들을 한 줄에 또는 한 명령어 안에 다른 명령어를 배치하고 싶은 유혹에 빠질 경우가 많을 것입니다. 절대 그렇게 하지 마십시오. 섹션 5에서 왜 예상한대로 작동하지 않는지 그리고 대신에 어떻게 하면 좋은지 말씀드리겠습니다.

d. 도움말 파일 찾는 법

몇 가지 방법이 있습니다. 도움말이 기본 위치에 설치되어 있다고 가정하겠습니다:

방법 1:

  1. 시작 메뉴를 찾거나 화면에서 Start Orb를 엽니다. 보통 좌하에 있습니다.
  2. 프로그램 또는 모든 프로그램을 선택합니다.
  3. 목록에서 AutoHotkey를 찾습니다.
  4. 찾았으면 AutoHotkey 도움말 파일이 보일 겁니다. 그것을 클릭합니다.
  5. 끝입니다!

방법 2:

  1. 데스크탑으로 갑니다.
  2. 내 컴퓨터 또는 컴퓨터를 찾습니다. 그것을 엽니다.
  3. AutoHotkey가 들어있는 하드 드라이브로 갑니다. 아마도 C:\ 드라이브이겠지요.
  4. Program Files 폴더 안에서 AutoHotkey를 검색합니다.
  5. AutoHotkey.chm를 찾거나 이름이 AutoHotkey인 파일을 찾습니다. 그 위에 노란색 물음표가 있습니다.
  6. 끝입니다!

2 - 핫키 & 핫스트링

핫키란 무엇인가? 핫키는 손길에 반응하는 키입니다. ... 농담입니다. 핫키는 사용자가 키보드를 눌러 어떤 행위를 촉발시키는 키 또는 키의 조합입니다. 예를 들어:

^j::
Send, 나의 첫 번째 스크립트
return

핫스트링이란 무엇인가? 핫스트링은 주로 타자하는 동안 약자를 확대하는 데 사용됩니다 (자동-치환). 또 스크립트 행위를 촉발시키는 데에도 사용할 수 있습니다. 예를 들어:

::ftw::Free the whales

두 예제 사이의 차이는 핫키가 Ctrl+J를 누를 때 촉발되지만 핫스트링은 "ftw"를 타자하면 바로 "Free the whales"로 치환합니다.

"그래서, 정확하게 어떻게 핫키를 만드는가?" 좋은 질문입니다. A hotkey is created by using a single pair of colons. 키나 키 조합의 오른쪽에 ::이 있어야 합니다. 그리고 내용은 아래에 있어야 하고, 바로 따라서 아래에 return이 있어야 합니다.

주의: 예외가 있지만, 그런 것들은 혼란만 가중 시킬 뿐입니다. 그래서 그런 것들은 이 자습서에서 다루지 않습니다. 적어도 지금은 아닙니다.

Esc::
MsgBox, Escape!!!!
return

A hotstring has a pair of colons on each side of the text you want to trigger the text replacement. While the text to replace your typed text goes on the right of the second pair of colons.

핫스트링은 위에 언급한 바와 같이 스크립트된 행위를 촉발할 수 있습니다. 핫키와 똑 같이 "멋지게 일을 하거라"와 같은 마법의 주문입니다.

::btw::
MsgBox, btw를 타자했습니다.
return

알아야 할 멋진 일은 각 핫키, 핫 스트링, 라벨 그리고 아직 언급하지 않은 많은 것들마다 많은 줄의 코드를 가질 수 있다는 것입니다.

^j::
MsgBox, Wow!
MsgBox, There are
Run, notepad.exe
WinActivate, Untitled - Notepad
WinWaitActive, Untitled - Notepad
Send, 7 lines{!}{Enter}
SendInput, inside the CTRL{+}J hotkey.
return

a. 키와 그의 신비한 심볼

궁금하실 겁니다. "도데체 어떻게 ^이 Ctrl을 뜻한다는 걸 알 수 있지?!". 음, 좋은 질문입니다. ^와 기타 심볼이 무엇을 뜻하는지 돕기 위해, 다음 표에 모아 보았습니다:

심볼 설명
# Win (윈도우즈 로고 키)
! Alt
^ Ctrl
+ Shift
& 앰퍼센트를 두 개의 키 사이 또는 마우스 버튼에 사용하면 그들을 조합해 맞춤 핫키를 만들 수 있습니다.

(완전한 심볼 목록은 핫키 페이지를 참조합니다)

Additionally, for a list of all/most hotkey names that can be used on the left side of a hotkey's double-colon, see List of Keys, Mouse Buttons, and Joystick Controls.

두 개의 키를 (오직 두 개까지만) 조합해 정의할 수 있습니다 (조이스틱 버튼 제외). 그 사이에  & 를 사용하면 됩니다. In the example below, you would hold down Numpad0 then press Numpad1 or Numpad2 to trigger one of the hotkeys:

Numpad0 & Numpad1::
MsgBox, Numpad0을 누르고 있는 동안 Numpad1를 눌렀습니다.
return

Numpad0 & Numpad2::
Run, notepad.exe
return

그러나 이제 핫스트링은 핫키가 그런 것처럼 멋진 수식키들이 있을까 궁금하실 겁니다. 물론 있습니다! Hotstring modifiers go between the first set of colons. 예를 들어:

:*:ftw::Free the whales

Visit Hotkeys and Hotstrings for additional hotkey and hotstring modifiers, information and examples.

b. 창 전용 핫키/핫스트링

종종 핫키나 핫스트링이 특정 창에서만 작동했으면 (또는 작동하지 말았으면) 하고 바랄 경우가 있습니다. 앞에 #를 두고 다음의 환상적인 명령어를 사용하면 됩니다:

#IfWinActive
#IfWinExist

(기술적으로 "지시어"라고 불리우는) 이 특별한 명령어들은 문맥을-감지하는 핫키와 핫스트링을 만듭니다. 그냥 창 제목을 지정하면 됩니다. But in some cases you might want to specify criteria such as HWND, group or class. 그런 것들은 좀 고급 주제이므로 다음에서 더 깊게 다룹니다: WinTitle 매개변수 & 가장 마지막으로 발견된 창.

#IfWinActive Untitled - Notepad
#Space::
MsgBox, 노트패드에서 WIN+SPACE를 눌렀습니다.
return

To turn off context sensitivity for subsequent hotkeys or hotstrings, specify any #IfWin directive but leave all of its parameters blank. 예를 들어:

; Untitled - Notepad
#IfWinActive Untitled - Notepad
!q::
MsgBox, 노트패드에서  ALT+Q를 눌렀습니다.
return

; Untitled - Notepad가 아닌 모든 창
#IfWinActive
!q::
MsgBox, 어떤 창인지는 모르지만 ALT+Q를 눌렀습니다.
return

When #IfWin directives are never used in a script, all hotkeys and hotstrings are enabled for all windows.

#IfWin 지시어는 위치에 민감합니다: 스크립트에서 물리적으로 아래에 있는 모든 핫키와 핫스트링에 영향을 미칩니다. 이 둘은 또 상호 배타적입니다; 즉, 가장 최신의 것만 효과가 있습니다.

; Notepad
#IfWinActive ahk_class Notepad
#Space::
MsgBox, 노트패드에서 WIN+SPACE를 눌렀습니다.
return
::msg::You typed msg in Notepad

; MSPaint
#IfWinActive Untitled - Paint
#Space::
MsgBox, MSPaint에서 WIN+SPACE를 눌렀습니다!
return
::msg::You typed msg in MSPaint!

For more in-depth information and similar commands, check out the #IfWinActive page.

c. 파일당 다중 핫키/핫스트링

어떤 이유로 이런 생각이 드실지 모르겠습니다. 그래서, 명확하게 밝혀 둡니다: 오토핫키는 파일 하나당 얼마든지 많은 핫키와 핫스트링을 가질 수 있습니다. 1이든 3253이든 (그 이상이든) 상관없습니다.

#i::
Run, https://www.google.com/
return

^p::
Run, notepad.exe
return

~j::
Send, ack
return

:*:acheiv::achiev
::achievment::achievement
::acquaintence::acquaintance
:*:adquir::acquir
::aquisition::acquisition
:*:agravat::aggravat
:*:allign::align
::ameria::America

위의 코드를 완벽하게 받아들일 수있는 다중 핫키와 다중 핫스트링입니다. 모두가 하나로 뭉뚱그려진 행복한 스크립트 파일이네요.

d. 예제

::btw::by the way  ; Replaces "btw" with "by the way" as soon as you press an default ending character.
:*:btw::by the way  ; Replaces "btw" with "by the way" without needing an ending character.
^n::  ; CTRL+N hotkey
Run, notepad.exe  ; Run Notepad when you press CTRL+N.
return  ; This ends the hotkey. The code below this will not be executed when pressing the hotkey.
^b::  ; CTRL+B hotkey
Send, {Ctrl down}c{Ctrl up}  ; 선택된 텍스트를 복사합니다. ^c도 사용할 수 있지만, 이 방법이 더 안전합니다.
SendInput, [b]{Ctrl down}v{Ctrl up}[/b] ; Wraps the selected text in BBCode tags to make it bold in a forum.
return  ; This ends the hotkey. The code below this will not be executed when pressing the hotkey.

3 - 키 눌림 전송하기

그래서 이제 키들을 프로그램으로 전송(타자)하기로 결정합니다. Send 명령어를 사용하면 됩니다. This command literally sends keystrokes, to simulate typing or pressing of keys.

But before we get into things, we should talk about some common issues that people have.

Just like hotkeys, the Send command has special keys too. 아주 많습니다.. 다음은 가장 많이 사용하는 심볼 네 가지입니다:

심볼 설명
! Alt를 전송합니다. 예를 들어, Send, This is text!a는 "This is text"를 전송한 다음 Alt+A를 누릅니다. 주의: !A는 어떤 프로그램에서는 !a와 전혀 다른 효과를 냅니다. 이것은 !AAlt+Shift+A를 누르는 반면 !aAlt+A를 누르기 때문입니다. 잘 모르겠으면, 소문자를 사용하십시오.
+ Shift를 전송합니다. 예를 들어, Send, +abC는 "AbC"를 전송하고, Send, !+aAlt+Shift+A를 누릅니다.
^ Ctrl를 전송합니다. 예를 들어, Send, ^!aCtrl+Alt+A를 누르고, Send, ^{Home}Ctrl+Home을 누릅니다. 주의: ^A는 어떤 프로그램에서 ^a와 전혀 다른 효과를 냅니다. 왜냐하면 ^ACtrl+Shift+A를 누르는 반면 ^aCtrl+A를 누르기 때문입니다. 잘 모르겠으면, 소문자를 사용하십시오.
# Win를 전송합니다 (윈도우즈 로고가 그려진 키) 그러므로 Send #eWin를 누른 다음 기호 E를 전송합니다.

The gigantic table on the Send page shows pretty much every special key built-in to AHK. 예를 들어: {Enter} 그리고 {Space}.

주의: 이 테이블은 핫키적용되지 않습니다. Meaning, you do not wrap Ctrl or Enter (or any other key) inside curly brackets when making a hotkey.

다음 예제에서 핫키에 해서는 안되는 것들을 보여줍니다:

; 핫키를 만들 때...
; 잘못됨
{LCtrl}::
Send, AutoHotkey
return

; 올바름
LCtrl::
Send, AutoHotkey
return

많은 사람들이 활괄호가 그냥 재미로 배치되어 있다고 생각합니다. 그러나 사실 꼭 필요합니다. 그렇게 해야 AHK가 {!}이 "느낌표"일 뿐 "Alt 키를 누르라"는 뜻이 아님을 이해합니다. 그래서 Send 페이지에 있는 테이블을 꼭 암기하시고 괄호를 제 자리에 배치하십시오. 예를 들어:

Send, This text has been typed{!} ; Notice the ! between the curly brackets? That's because if it wasn't, AHK would press the ALT key.
; 위와 같지만,  이 번에는 ENTER 키입니다. AHK는 "Enter"를 타자해 버립니다
; it wasn't wrapped in curly brackets.
Send, Multiple Enter lines have Enter been sent. ; 잘못됨
Send, Multiple{Enter}lines have{Enter}been sent. ; 올바름

또다른 문제는 사람들이 Send 명령어에서 모든 것들은 괄호에 싸 넣어야 한다고 생각한다는 것입니다. 그렇지 않습니다. 표에 없으면 괄호가 필요하지 않습니다. You do not need to wrap common letters, numbers or even some symbols such as . (period) in curly brackets. Also, with the Send commands you are able to send more than one letter, number or symbol at a time. So no need for a bunch of Send commands with one letter each. 예를 들어:

Send, {a}       ; 잘못됨
Send, {b}       ; 잘못됨
Send, {c}       ; 잘못됨
Send, {a}{b}{c} ; 잘못됨
Send, {abc}     ; 잘못됨
Send, abc       ; 올바름

To hold down or release a key, enclose the key name in curly brackets and then use the word UP or DOWN. 예를 들어:

; 다음은 키 하나를 누름과 동시에 또다른 키 (또는 키들)을 누르는 방법입니다.
; 한가지 방법이 작동하지 않으면, 다른 방법을 시도해 보십시오.
Send, ^s                     ; 둘 다 CTRL+S를 전송합니다.
Send, {Ctrl down}s{Ctrl up}  ; 둘 다 CTRL+S를 전송합니다.
Send, {Ctrl down}c{Ctrl up}
Send, {b down}{b up}
Send, {Tab down}{Tab up}
Send, {Up down}  ; 위 화살표 키를 누릅니다.
Sleep, 1000      ; 1초 동안 누르고 있습니다.
Send, {Up up}    ; 위 화살표 키를 뗍니다.

그러나 이제 궁금하실 겁니다. "정말 긴 Send 명령어들을 어떻게 잘 읽을 수 있지?". 쉽습니다. 계속 섹션을 사용하면 됩니다. 그냥 새 줄에 반괄호를 열고, 내용을 넣고, 마지막으로 반괄호로 줄을 닫습니다. 더 자세한 정보는 계속 섹션을 참조합니다.

Send,
(
첫 번째 줄
두 번째 줄
원하는 만큼 줄을 배치할 수 있습니다.
)

Note: There are several different forms of Send. 각자 따로 특별한 특징이 있습니다. If one form of Send does not work for your needs, try another type of Send. Simply replace the command name "Send" with one of the following: SendRaw, SendInput, SendPlay, SendEvent. 각자 어떤 일을 하는지에 관한 더 자세한 정보는 여기를 읽어 보십시오.

a. 게임

중요합니다: 많은 게임은, 특히 현대의 게임은, 속이는 것을 방지하는 기능이 있습니다. 예를 들어, 이런 종류의 게임으로는 GameGuard, Hackshield, PunkBuster, 등등이 있습니다. 이런 시스템을 우회하는 일은 게임사의 정책을 위반하는 것이며 그러면 여러분은 제명 당할 수 있습니다. 해결책은 대단히 복잡합니다.

게임이 속임 방지 시스템이 있고 핫키와 핫스트링 그리고 Send 명령어가 작동하지 않는다면, 안타까운 일입니다. 그렇지만, 어떤 게임에서는 작동의 기회를 높일 수 있는 방법이 있지만, 마법의 "당장 게임에서 작동하라" 버튼은 없습니다. 그래서 포기하기 전에 이 모든 것들을 시도해 보십시오.

DirectX와 관련된 문제도 있습니다. If you are having issues and you know the game uses DirectX, try the stuff described on the FAQ page. More DirectX issues may occur when using PixelSearch, PixelGetColor or ImageSearch. 어떤 색을 얻으려고 시도하는지에 상관없이 색깔이 검정색으로 바뀔 수 있습니다 (0x000000). 가능하면 창(Windowed 역주: 입력 방식을 전적으로 운영체제에 맡김) 모드에서 시험해 보십시오. 그러면 DirectX 문제가 해결될 지도 모릅니다.

AutoHotkey를 모든 프로그램에서 작동하시키는 단 한가지 해결책은 없습니다. 시도한 모든 것이 실패한다면, 안타깝게도 AutoHotkey로는 여러분의 요구를 만족시킬 수 없는 것입니다.

4 - 프로그램 & 웹사이트 실행하기

mspaint.exe, calc.exe, script.ahk 심지어 폴더 같은 프로그램을 실행하려면, Run 명령어를 사용할 수 있습니다. 심지어 https://www.autohotkey.com/과 같이 URL에도 사용할 수 있습니다. 원하는 프로그램의 유형을 실행하도록 컴퓨터가 환경이 설정되어 있다면, 아주 간단합니다:

; 프로그램을 실행합니다. 주의: 대부분의 프로그램은 전체 파일 경로를 요구합니다:
Run, %A_ProgramFiles%\Some_Program\Program.exe

; 웹 사이트를 실행합니다:
Run, https://www.autohotkey.com

명령어-줄 매개변수와 CLSID와 같은 다른 고급 특징들도 역시 있습니다. If you want to learn more about that stuff, visit the Run page.

다음에 몇 가지 예를 더 보여줍니다:

;  윈도우즈의 표준 프로그램들과 같이 전체 경로가 필요하지 않은 프로그램이 있습니다:
Run, notepad.exe
Run, mspaint.exe

; Run the "My Documents" folder using a built-in variable:
Run, %A_MyDocuments%

; 웹 사이트를 실행합니다:
Run, https://www.autohotkey.com
Run, https://www.google.com

For more in-depth information and examples, check out the Run page.

5 - 명령어 vs. 함수

오토핫키는 코드를 만드는데 사용되는 크게 두 가지 유형이 있습니다: 명령어와 함수가 그것입니다.

A list of all commands and built-in functions can be found here.

명령어

그의 구문을 보면 (그의 겉 모습으로) 명령어인지 아닌지 구분할 수 있습니다. 명령어는 매개변수에 반괄호를 사용하지 않지만 함수는 사용합니다. 그래서 명령어는 다음과 같이 보입니다:

Command, Parameter1, Parameter2, Parameter3

명령어를 사용할 때, 다른 명령어를 같은 줄에 놓을 수 없습니다 (예외: IfEqual). 명령어를 다른 명령어의 매개변수 안에 놓을 수 없습니다. 예를 들어:

MsgBox, Hello Run, notepad.exe   ; 잘못됨
MsgBox, Hello, Run, notepad.exe  ; 잘못됨

MsgBox, Hello      ; 올바름
Run, notepad.exe

Commands also differ from function in that they use "legacy syntax". This means that you need percent signs around a variable, such as %Var%, and that any text and numbers do not need to be in quotation marks, such as This is some text. 게다가, 함수와는 다르게 매개변수 안에서 수학식을 사용할 수 없습니다.

매개변수에 수학식을 사용할 수는 있습니다. 강제로 % 기호로 표현식을 만들면 되지만, 이에 관해서는 다루지 않겠습니다.

함수

위에 언급한 바와 같이, 함수는 반괄호를 사용하기 때문에 다릅니다. 전형적인 함수의 모습은 다음과 같습니다:

Function(Parameter1, Parameter2, Parameter3)

함수는 몇 가지 큰 차이점이 있습니다:

  1. 그 안에 수학식을 사용할 수 있습니다:
    SubStr(37 * 12, 1, 2)
    SubStr(A_Hour - 12, 2)
  2. 변수는 퍼센트 기호로 둘러쌀 필요가 없습니다:
    SubStr(A_Now, 7, 2)
  3. 함수는 함수 안에 들어갈 수 있습니다:
    SubStr(A_AhkPath, InStr(A_AhkPath, "AutoHotkey"))
  4. 텍스트는 인용부호로 둘러싸야 합니다:
    SubStr("스크립팅을 하고 있어요, 정말 죽여주네요!", 16)

함수는 명령어와 다르게 보통 값을 돌려줍니다. 명령어는 OutputVar 매개변수가 필요하지만, 함수는 그렇지 않습니다. The most common way assigning the value of a function to a variable is like so:

MyVar := SubStr("스크립팅을 하고 있어요, 정말 죽여주네요!", 16)

이것만이 유일한 방법은 아닙니다. 그러나 가장 많이 사용되는 방법입니다. You are using MyVar to store the return value of the function that is to the right of the := operator. 자세한 것은 함수을 참조하십시오.

짧게 말해:

; 다음은 명령어입니다:
MsgBox, 이것은 텍스트입니다.
StringReplace, Output, Input, AutoHotKey, AutoHotkey, All
SendInput, 이거 정말 굉장하네요{!}{!}{!}

; 다음은 함수입니:
SubStr("스크립팅을 하고 있어요, 정말 죽여주네요!", 16)
FileExist(VariableContainingPath)
Output := SubStr("스크립팅을 하고 있어요, 정말 죽여주네요!", 16)

a. 코드 블록

Code blocks are lines of code surrounded by little curly brackets ({ and }). They group a section of code together so that AutoHotkey knows it's one big family and that it needs to stay together. They are most often used with functions and control flow statements such as If and Loop. 이것이 없다면, 블록에서 첫 줄만 호출됩니다.

다음 코드에서, 두 줄 모두 MyVar가 5와 같은 경우에만 실행됩니다:

if (MyVar = 5)
{
    MsgBox, MyVar는 %MyVar%와 같습니다!!
    ExitApp
}

다음 코드에서, 메시지 상자는 MyVar가 5일 경우에만 보입니다. The script will always exit, even if MyVar is not 5:

if (MyVar = 5)
    MsgBox, MyVar는 %MyVar%와 같습니다!!
    ExitApp

This is perfectly fine since the if-statement only had one line of code associated with it. It's exactly the same as above, but I outdented the second line so we know it's separated from the if-statement:

if (MyVar = 5)
    MsgBox, MyVar는 %MyVar%와 같습니다!!
MsgBox, We are now 'outside' of the if-statement. We did not need curly brackets since there was only one line below it.

6 - 변수

변수는 작은 포스트잇 메모지처럼 그 안에 정보를 담습니다. 텍스트나, 숫자, 그리고 함수나 명령어 심지어 수학 방정식으로부터 얻은 데이터를 저장하는 데 사용합니다. Without them, programming and scripting would be much more tedious.

변수는 몇 가지 방법으로 할당할 수 있습니다. 여기에서는 가장 흔한 방법을 다루겠습니다. 등호 기호(=)에 주목해 주십시오.

Legacy text assignment
MyVar = Text

This is the simplest form for a variable, a legacy assignment. 그냥 텍스트를 타자해 넣으면 그걸로 끝입니다.

Legacy variable assignment
MyVar = %MyVar2%

Same as above, but you are assigning a value of a variable to another variable.

Legacy mixed assignment
MyVar = %MyVar2% some text %MyVar3%.

A combination of the two legacy assignments above.

Expression text assignment
MyVar := "Text"

= 앞에 있는 : 때문에 표현식 할당이라고 부릅니다. 텍스트는 인용부호 처리해 주어야 합니다.

Expression variable assignment
MyVar := MyVar2

In expression mode, variables do not need percent signs.

Expression number assignment
MyVar := 6 + 8 / 3 * 2 - Sqrt(9)

표현식 덕분에, 수학 계산을 할 수 있습니다!

Expression mixed assignment
MyVar := "The value of 5 + " MyVar2 " is: " 5 + MyVar2

A combination of the three expression assignments above.

Equal signs (=) with a symbol in front of it such as := += -= .= etc. are called assignment operators and always require an expression.

a. 퍼센트를 사용할 때

변수와 관련하여 오토핫키에서 가장 많이 제기되는 문제중 하나는 언제 퍼센트 기호 (%)를 사용하는가 하는 것입니다. 다음 설명으로 깔끔하게 혼란이 제거되기를 바랍니다.

When to use percent signs:

When not to use percent signs:

b. 사용자 입력 얻기

종종 사용자가 값을 채워 넣어주기를 바랄 경우가 있습니다. 여러 가지 방법이 있지만, 가장 간단한 방법은 InputBox입니다. 다음은 간단한 예입니다. 사용자에게 두 가지 질문을 하고 그 답을 가지고 무슨 일을 합니다:

InputBox, OutputVar, Question 1, 이름이 무엇입니까?
if (OutputVar = "Bill")
    MsgBox, 멋진 이름이군요, %OutputVar%.

InputBox, OutputVar2, Question 2, 오토핫키를 좋아합니까?
if (OutputVar2 = "yes")
    MsgBox, %OutputVar2%`라고 답해 주셔서 고맙습니다. %OutputVar%! 여러분의 훌륭한 친구가 되어 드리겠습니다.
else
    MsgBox, %OutputVar%`, 정말 슬프군요.

c. 다른 예제들?

MsgBox, 4,, 계속하시겠습니까?
IfMsgBox, No
    return  ; No이면, 코드를 멈춥니다.
MsgBox, 당신은 YES를 눌렀습니다.  ; 그렇지 않으면, 사용자는 yes를 고른 것입니다.
; 퍼센트 기호를 사용해야 할 때와 하지 말아야 할 때는 보여주는 몇 가지 예들:
Var = Text  ; Assign some text to a variable (legacy).
Number := 6  ; Assign a number to a variable (expression).
Var2 = %Var%  ; Assign a variable to another (legacy).
Var3 := Var  ; Assign a variable to another (expression).
Var4 .= Var  ; Append a variable to the end of another (expression).
Var5 += Number  ; Add the value of a variable to another (expression).
Var5 -= Number  ; Subtract the value of a variable from another (expression).
Var6 := SubStr(Var, 2, 2)  ; 함수 안의 변수입니다. 이것은 언제나 표현식 할당입니다.
Var7 = %Var% Text  ; Assigns a variable to another with some extra text (legacy).
Var8 := Var " Text"  ; Assigns a variable to another with some extra text (expression).
MsgBox, %Var%  ; 명령어 안의 변수입니다. 
StringSplit, Var, Var, x  ; InputVar와 OutputVar를 사용하는 명령어 안의 변수입니다.
if (Number = 6)  ; Whenever an IF has parentheses, it'll be an expression. So no percent signs.
if (Var != Number)  ; Whenever an IF has parentheses, it'll be an expression. So no percent signs.
if Number = 6  ; Without parentheses, the IF is legacy. However, only variables on the 'right side' need percent signs. 
if Var1 < %Var2%  ; Without parentheses, the IF is legacy. However, only variables on the 'right side' need percent signs.

7 - 객체

객체는 좀 더 효율적으로 사용하기 위해 데이터를 조직하는 방법입니다. 종종 객체는 배열이라고 지칭되기도 합니다. 그러나 모든 배열은 그냥 객체일 뿐이라는 사실을 인식하는 것이 중요합니다. 객체를 어디에 사용하려고 하는가에 따라 다르게 부르기도 하지만, 그 모든 객체는 같은 것입니다.

객체는 기본적으로 변수 집합입니다. 변수 이름은 "키"라고 알려져 있고, 그 변수의 내용은 "값"이라고 합니다.

객체를 배열 또는 인덱스 배열이라고 부른다면, 보통 모든 키가 1부터 시작해서 연속적으로 증가하는 숫자라는 뜻입니다. 객체를 연관 배열이라고 부른다면, 키가 문자열(텍스트)이거나 아니면 비-연속 숫자들이라는 뜻입니다. 종종, 그 둘은 혼용됩니다. 연속 숫자도 마찬가지입니다!

키나 값이 무엇인지는 제한이 없습니다. 심지어 다른 배열이 될 수도 있습니다! 값이 또 배열이면, 이것을 내포 배열이라고 부릅니다. 이에 관해서는 나중에 설명드리겠습니다.

객체를 사용하고 싶은 이유가 많이 있습니다. 예를 들면:

a. 객체 만들기

객체를 만들려면 몇 가지 방법이 있습니다. 가장 흔한 방법은 아래와 같습니다:

각괄호 구문입니다
MyObject := ["one", "two", "three", 17]

이것으로 "인덱스 배열"을 만들 수 있습니다. 인덱스 배열은 항목 리스트를 1부터 쭈욱 나열해 보여주는 객체입니다. 이 예제에서, 값 "one"은 객체 키1에 저장됩니다 (인덱스 1), 그리고 값 17은 객체 키 4에 저장됩니다 (인덱스 4).

활괄호 구문입니다
Banana := {"Color": "Yellow", "Taste": "Delicious", "Price": 3}

이것으로 "연관 배열"을 정의할 수 있습니다. 연관 배열은 각 항목에 이름이 있는 데이터 집합입니다. 이 예제에서 값 "Yellow"는 객체 키 "Color"에 저장됩니다. 또, 값 3은 객체 키 "Price"에 저장됩니다.

Array function
MyObject := Array("one", "two", "three", 17)

이 함수는 각괄호 구문과 동등하지만, 함수에 싸여 있습니다.

Object function
Banana := Object("Color", "Yellow", "Taste", "Delicious", "Price", 3)

이 함수는 활괄호와 동등하지만, 함수에 싸여 있습니다.

이 모든 정의가 같은 것(객체)을 만들어 낸다는 것을 기억하는 것이 중요합니다. 단지 키가 다를 뿐입니다.

b. 객체 사용하기

객체를 사용하는 방법이 여러가지가 있습니다. 값을 열람하기, 값을 설정하기, 값을 추가하기, 등등이 포함됩니다.

값을 설정하려면:

각괄호 표기법입니다
Banana["Pickled"] := True ; 이 바나나는 절인 바나나입니다. 우웩.

객체에 값을 설정하는 일은 변수에 값을 설정하는 것 만큼이나 단순합니다. All you have to do is put your bracket notation on the left side of an expression assignment operator :=.

점 표기법입니다
Banana.Consistency := "Mushy"

The same as above but with the dot notation.

값을 열람하려면:

각괄호 표기법입니다
Value := Banana["Color"]

표현식을 키로 사용하여 객체로부터 값을 얻을 수 있습니다. 이 경우, 간단한 표현식 "Color"를 사용했습니다. 이것이 (당연히) 키 Color입니다. 메시지 박스에 "Yellow"라는 단어가 나타날 텐데, 이것은 앞 섹션에서 키 Color에 할당했던 값입니다.

점 표기법입니다
Value := Banana.Color

이 방법은 기호 문자열만 키로 사용할 수 있습니다. 변수는 키로 사용할 수 없습니다.

새 키와 값을 추가하려면:

각괄호 표기법입니다
MyObject["NewerKey"] := 3.1415

직접적으로 키와 값을 추가하려면, 그냥 존재하지 않는 키를 설정하기만 하면 됩니다.

점 표기법입니다
MyObject.NewKey := "Shiny"

The same as above but with the dot notation.

InsertAt method
MyObject.InsertAt(Index, Value1, Value2, Value3...)

Index는 정수 키입니다. 이렇게 하면 삽입할 때마다 이 값보다 더 높은 모든 키들이 위로 이동합니다. 틈이 있어도 이동합니다. (예를 들어, 키가 1부터 100 까지만 존재하고, 값을 키 50에 삽입하면, 100은 101로 이동합니다).

Push method
MyObject.Push(Value1, Value2, Value3...)

이렇게 하면 MyObject배열의 끝에 값이 "추가됩니다". 다른 말로 해서, 값을 가장 높은 정수키보다 하나 더 큰 위치에 삽입합니다.

키와 값을 삭제하려면:

값을 제거하기
Banana.Consistency := ""

가장 쉽게 값을 제거하는 방법은 그냥 없애 버리는 것입니다. 그냥 ""로 설정하면 됩니다. 빈 문자열이라고 부릅니다. 이것으로는 키가 제거되지 않지만, 값이 설정되지 않은 값과 동일하게 보이도록 만듭니다. HasKey 메쏘드를 사용하면 키가 여전히 존재한다고 알려줄 수 있습니다. 그러면 여전히 For 회돌이에 나타날 것입니다.

Delete method
RemovedValue := MyObject.Delete(AnyKey)

This and the next methods below remove the key and the value. MyObject[AnyKey]의 이전 값은 RemovedValue에 저장됩니다.

NumberOfRemovedKeys := MyObject.Delete(FirstKey, LastKey)

Allows you to remove a range of numbered/integer or string keys between FirstKey and LastKey. 돌려받는 값은 제거된 키의 개수입니다. 이것은 키 사이에 틈이 있을 때 유용합니다 (예를 들어, 키를 1부터 4까지 지정했지만, 키 2는 존재하지 않는다면, NumberOfRemovedKeys가 3으로 설정되고 세 개의 키만 제거됩니다).

Pop method
MyObject.Pop()

가장 높은 정수 키가 제거되고, 그 값을 돌려줍니다. 영향을 받을 더 높은 키는 전혀 없습니다.

RemoveAt method
RemovedValue := MyObject.RemoveAt(Index)
NumberOfRemovedKeys := MyObject.RemoveAt(Index, Length)

Index부터 Index + Length - 1 (포함e)까지 모든 키들이 삭제됩니다. Length를 생략하면 1이 기본값입니다. 키를 제거한 다음 이 보다 높은 모든 숫자/정수 키들을 위로 올려서 틈을 메웁니다. 그래서 값이 Index + Length에 있었다면 이제 그 값은 Index에 있습니다. 이 방식은 여러 값이 지정된 InsertAt 메쏘드의 작동 방식과 비슷합니다.

8 - 기타 등등 도움

이제 여행의 막바지에 다다랐습니다. 모쪼록 무언가를 배웠기를 바랍니다. 그러나 끝내기 전에, 여러분이 꼭 알아야 한다고 생각하는 다른 것들을 여기에 제시합니다. 즐거운 시간 되시기를!

a. The mysterious square brackets

문서를 통하여, 다음 두 심볼이 보일 겁니다 ([ 그리고 ]). 거의 모든 페이지 상단에 노란색 구문 박스 안에서 코드를 둘러 싸고 있지요. 이 각활호 안에 든 모든 것들은 선택적입니다. 그 안에 든 것들은 필요 없으면 생략해도 된다는 뜻입니다. When writing your code, it is very important to NOT type the square brackets in your code.

ControlGetText 페이지에서 이것을 보실 수 있습니다:

ControlGetText, OutputVar , Control, WinTitle, WinText, ExcludeTitle, ExcludeText

그래서 그냥 원하다면 이렇게 해도 됩니다:

ControlGetText, OutputVar

또는 좀 더 세밀하게 이렇게 해도 됩니다:

ControlGetText, OutputVar, Control, WinTitle

ExcludeTitle를 사용하고 싶지만 WinTextWinTitle은 채우고 싶지 않다면? 간단합니다!

ControlGetText, OutputVar, Control,,, ExcludeTitle

매개변수는 무시할 수 없습니다. 그냥 빈 채로 놓아 두는 것은 괜찮습니다. WinTitle, WinText를 무시해 버리면, 다음과 같이 보일 것이고 문제를 일으킵니다:

ControlGetText, OutputVar, Control, ExcludeTitle

b. AHK 버전 알아내기

다음 코드를 실행하면 AHK 버전을 볼 수 있습니다:

MsgBox, %A_AhkVersion%

또는 "AutoHotkey 도움말 파일" 또는 "AutoHotkey.chm"을 시작 메뉴나 설치 디렉토리에서 찾아 보십시오.

c. 시행 착오

시행 착오는 배움에서 아주 흔하고 효과적인 방법입니다. 모든 것들에 도움을 구하는 대신에, 좀 혼자만의 시간을 가지고 (몇 시간이나 몇 일 동안) 작동시켜 보려고 시도하는 것이 더 빨리 배우는데 도움이 되실 겁니다.

뭔가를 시도해 보고 에러를 맞이해 보면서, 그 에러를 연구합니다. 다음 코드를 수정한 다음, 다시 시도해 봅니다. 여전히 에러를 맞이한다면, 코드를 좀 더 수정합니다. 코드가 더 이상 실패하지 않을 때까지 계속 시도와 실패를 거듭합니다. 문서를 읽고, 에러를 읽고 무엇이 작동하고 무엇이 작동하지 않는지 배우면서 많은 것을 배우실 겁니다. 시도, 실패, 시도, 실패,시도, 실패, 시도, 실패, 성공!

이 방법으로 수 많은 "프로들이" 배웠습니다. 그러나 도움을 구하는 데 두려워하지 마십시오. 면박당하지 않습니다. 배우는 데는 시간이 필요하며, 여러분이 만나는 "프로"가 단 몇 시간 몇 일 만에 배워서 마스터가 된 것이 아닙니다.

"처음에는 성공하지 못하더라도, 다시 시도, 또 시도, 시도하라." - Hickson, William E.

d. 들여쓰기

들여쓰기는 아주 중요합니다! 코드는 완벽하게 실행되지만, 코드를 읽을 때 심각한 두통거리가 될 것입니다. 작은 코드라면 (25 줄 이하) 아마도 들여쓰기가 없더라도 읽는데 문제가 없겠지만, 조만간 어려워질 겁니다. 되도록이면 빠리 들여쓰기를 배우는 편이 제일 좋습니다. 들여쓰기는 특별한 스타일이 없지만, 일관성을 유지하는 것이 제일 좋습니다.

"들여쓰기란 무엇인가?" 아마도 이렇게 묻고 싶겠지요? 무엇이 무엇에 속해 있는지 보기 위해 코드를 간격을 두어 쪼개는 것입니다. 사람들은 한 레벨 당 보통 3 이나 4 개의 공백 또는 한 개의 탭을 사용합니다.

Not indented:

if (car = "old")
{
MsgBox, 자동차가 정말 오래되었습니다.
if (wheels = "flat")
{
MsgBox, 이 자동차는 운전하기에 안전하지 않습니다.
return
}
else
{
MsgBox, 주의하세요! 이 구형 자동차는 운전하기에 위험합니다.
}
}
else
{
MsgBox, 와우`, 정말 멋진 자동차를 가지셨군요.
}

들여쓰기함:

if (car = "old")
{
    MsgBox, 자동차가 정말 오래되었습니다.
    if (wheels = "flat")
    {
        MsgBox, 이 자동차는 운전하기에 안전하지 않습니다.
        return
    }
    else
    {
        MsgBox, 주의하세요! 이 구형 자동차는 운전하기에 위험합니다.
    }
}
else
{
    MsgBox, 와우`, 정말 멋진 자동차를 가지셨군요.
}

See Wikipedia's Indentation style page for various styles and examples. 여러분이 읽기에 가장 쉽다고 생각하는 스타일을 골라 들여쓰기 하는 법을 배우십시오.

e. 도움 요청하기

물어보기 전에, 먼저 스스로 연구해 봅니다. 또는 스스로 코드해 봅니다. 결과가 만족스럽지 못하다면, 아래를 읽어 보십시오.

바로 답을 얻지 못하더라도, 적어도 하루 (24 시간)은 기다린 후에 도움을 더 요청합니다. 우리도 기꺼이 도와주고 싶지만, 시간이 나야 도와줄 수 있습니다. 일을 하고 있을 수도 있고, 잠자거나, 게임하거나, 가족과 함께이거나 아니면 그냥 바쁠 수 있습니다.

도움을 기다리는 동안, 스스로 시도하면서 배울 수 있습니다. 도움없이 스스로 뭔가를 이루면 큰 보람을 느끼실 것입니다.

f. 기타 링크

자주 묻는 질문(FAQ)