AutoHotkey

Version v1.1.24.00

https://autohotkey.com

©2003-2014 Chris Mallett, portions ©AutoIt Team and the AHK community

Software License: GNU General Public License

중요한 사항

AutoHotkey 1.0 과 AutoHotkey 1.1 간에는 다소 근본적인 차이 (특히 유니코드 사용 및 x64 환경에서의 실행) 때문에 AutoHotkey 1.0 에서 작성된 스크립트는 AutoHotkey 1.1에서 예상처럼 실행되지 않을 수 있습니다.. 알려진 호환성 문제와 해결책에 관한 더 자세한 정보는 다음 링크를 참조하시오. :

- 스크립트 호환성 - 유니코드 vs ANSI, DllCall, NumPut/Get, 기타 변경사항

- 스크립트 파일 코드 페이지 – 스크립트을 UTF-8로 저장하시오!

빠른 참고사항

기본적인 것 :

- 초보자를 위한 기본서

- AutoHotkey을 지원하는 텍스트 편집기

- 자주 묻는 질문

- 스크립트

- 명령어

- 변수 및 표현법

- 함수

- 객체

- 대화식 디버깅

기보드 와 마우스 :

- 핫키 (마우스, 조이스틱 그리고 키보드 단축키)

- 핫스트링과 자동-바꾸기

- 키 또는 버튼의 리맵

- 키 또는 마우스버튼과 조이스틱 컨트롤 목록

기타 :

- DllCall

- 정규식 표현 참조

- AutoHotkey_L (AutoHotkey 1.1) 특징

감사의 말

조나단 베네트(Jonathan Bennett)에게 특히 감사드립니다. 그는 넓은 마음으로 AutoIt v2를 1999년에 자유 소프트웨어로 배포해 주셨습니다. 그 덕분에 필자는 영감을 받았고 본인은 물론 세상의 모든 사람들은 시간을 절약하게 되었습니다. 게다가, 오토핫키의 개선 사항들을 AutoIt v2 명령어 세트에 적용해 주셨고, 뿐만 아니라 Window Spy 그리고 예전 스크립트 컴파일러를 AutoIt v3 소스 코드로부터 직접 적용해 주셧습니다. 그래서 존과 그의 AutoIt 저자들에게도 감사의 말씀을 전하는 바입니다.

마지막으로, AutoHotkey는 오늘날 이 분들이 없었다면 존재하지 못했을 것입니다.

~ Chris Mallett(크리스 멀릿)


기본서 (빠른 학습)

AutoHotkey 초보자 자습서, 작성 티드비트(tidbit)

목차

  1. 기본 지식
    1. AutoHotkey 내려받기
    2. 스크립트 만드는 법
    3. 명령어들을 병합할 수 없다
    4. 기타 기본 정보
  2. 핫키 & 핫스트링
    1. 키 그리고 심볼
    2. 창 전용
    3. 파일당 여러 핫키
    4. 예제
  3. 키 눌림 전송하기
    1. 게임
  4. 프로그램 실행하기 & 웹사이트 열기
  5. 명령어 vs. 함수
    1. 코드 블록
  6. 변수
    1. 퍼센트를 사용할 때
    2. 사용자 입력 얻기
    3. 다른 예제들?
  7. 객체
    1. 객체 만들기
    2. 객체 사용하기
  8. 기타 도움이 되는 것들
    1. 신비한 []
    2. AHK 버전 알아내기
    3. 시행 착오
    4. 들여쓰기
    5. 도움 구하기
    6. 기타 링크

1 - 기본 지식

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

a. AutoHotkey를 내려받아 설치하기

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

텍스트 지시:

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

동영상 지시:
Frankie's "Install and Hello World"
http://www.autohotkey.com/forum/viewtopic.php?t=77674

b. 스크립트 만드는 법

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

텍스트 지시:

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

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

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

^j::

Send, 나의 첫 번째 스크립트

Return

나중에 더 깊이 들어가 보겠습니다. 그 때까지, 여기에서는 위의 코드를 설명합니다.
- 첫 줄. ^j::가 바로 핫키입니다. ^는 CTRL을 의미하고, j는 기호문자 j입니다. ::의 왼쪽에 있는 것은 모두 누를 필요가 있는 키들입니다.
- 둘째 줄. Send, My First Script는 키들을 전송하는(SEND) 법을 보여줍니다. SEND는 명령어이고, 쉼표(,) 다음에 오는 것들이 모두 타자됩니다.
- 셋째 줄. Return. Return은 앞으로 가장 많이 접하게 되실 겁니다. 문자 그대로 코드를 멈춥니다. 아래로 더 이상 진행하지 않습니다. 이렇게 하면 스크립트에 많은 내용이 있을 때 문제를 피할 수 있습니다.

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

비디오 지시:
Frankie's "Install and Hello World"
http://www.autohotkey.com/forum/viewtopic.php?t=77674

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"로 치환합니다.

"그래서, 정확하게 어떻게 핫키를 만드는가?" 좋은 질문입니다. 핫키는 한 쌍의 ::로 만들 수 있습니다. 키나 키 조합의 오른쪽에 ::이 있어야 합니다. 그리고 내용은 아래에 있어야 하고, 바로 따라서 아래에 Return이 있어야 합니다.

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

esc::

MsgBox Escape!!!!

Return

핫 스트링은 한 쌍의 ::로 만듭니다. 그 사이에 텍스트 교체를 촉발하고 싶은 텍스트를 넣습니다. 반면에 타자된 텍스트를 대신할 텍스트는 두 번째 :: 쌍의 오른쪽에 배치합니다.

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

::btw::

MsgBox You typed "btw".

Return

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

^j::

MsgBox Wow!

MsgBox this is

Run, Notepad.exe

winactivate, Untitled - Notepad

WinWaitActive, Untitled - Notepad

send, 7 lines{!}{enter}

sendinput, inside the ctrl{+}j hotkey

Return

a. 키와 그것을 뜻하는 심볼

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

심볼 | 설명
# | Win (윈도우즈 로고 키)
! | Alt
^ | Control
+ | Shift
& | 앰퍼센드는 두 개의 키 또는 마우스 버튼 사이에 사용되어 맞춤 핫키로 조합해 사용할 수 있습니다.

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

추가로, 다음은 핫키의 왼쪽에 사용할 수 있는 모든/거의 대부분의 핫키 이름 목록입니다:
KeyList.htm

두 개의 키를 (오직 두 개까지만) 조합해 정의할 수 있습니다 (조이스틱 버튼 제외). 그 사이에 &를 사용하면 됩니다. 아래의 예제에서, Numpad0를 누른 다음 두 번째 키를 눌러서 핫키를 촉발시켜 보겠습니다:

Numpad0 & Numpad1::

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

Return

Numpad0 & Numpad2::

Run Notepad

Return

그러나 이제 핫스트링은 핫키가 그런 것처럼 멋진 수식키들이 있을까 궁금하실 겁니다. 물론 있습니다!
핫스트링 수식키는 첫 번째 :: 쌍 사이에 들어갑니다. 다음과 같이:

:*:ftw::Free the whales

핫키와 핫스트링 수식키에 관한 더 자세한 정보와 예제는 다음을 참조합니다:
핫키
핫스트링

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

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

#IfWinActive
#IfWinExist

(기술적으로 "지시어"라고 불리우는) 이 특별한 명령어들은 문맥을-감지하는 핫키와 핫스트링을 만듭니다. 그냥 창 제목을 지정하면 됩니다. 그러나 어떤 경우는 HWND나 그룹 또는 클래스를 지정하고 싶을 경우도 있습니다. 그런 것들은 좀 고급 주제이므로 다음에서 더 깊게 다룹니다: #IfWinActive.

#IfWinActive Untitled - Notepad

#space::

MsgBox 노트패드에서 Win+Spacebar를 눌렀습니다.

Return

#IfWinActive

문맥 감지를 끄려면, #IfWin 명령어는 지정하되 그의 모든 매개변수를 빈 채로 두면 됩니다. 예를 들어:

; Notepad

#IfWinActive untitled - Notepad

!q::

MsgBox, 노트패드에서 Alt 와 Q를 눌렀습니다.

Return

#IfWinActive

; Untitled - Notepad가 아닌 모든 창

!q::

MsgBox, 어떤 창인지는 모르지만 Alt와 Q를 눌렀습니다.

Return

#IfWin 명령어가 꺼져 있으면 (또는 스크립트 안에서 전혀 사용되지 않으면), 모든 핫키와 핫스트링은 모든 창에 반응합니다.

#IfWin 명령어는 위치에 영향을 미칩니다: 물리적으로 이 명령어 아래에 있는 모든 핫키와 핫스트링은 모두 영향을 받습니다.

; Notepad

#IfWinActive ahk_class Notepad

#space::

MsgBox, 노트패드에서 Win+Spacebar를 눌렀습니다.

Return

::msg::You typed msg in Notepad

#IfWinActive

; MSPaint

#IfWinActive untitled - Paint

#space::

MsgBox, MSPaint에서 Win+Spacebar를 눌렀습니다!

Return

::msg::You typed msg in MSPaint!

#IfWinActive

더 깊은 정보과 비슷한 명령어들을 보려면, 다음을 참조합니다:
#IfWinActive

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

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

#i::

run, http://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
; EndChar 를 누르면 바로 "btw"를 "By the way"로 교체합니다.

:*:btw::By the way
; "btw"를 "By the way"로 바꿉니다. EndChar가 필요 없습니다.

^n::
; Ctrl & n Hotkey

run, notepad.exe
; Ctrl & n 을 누려면 바로 notepad.exe를 실행합니다

Return
; 핫키가 끝납니다. 이 아래의 코드는 실행되지 않습니다.

^b::
; Ctrl & b Hotkey

send, {ctrl down}c{ctrl up}
; 선택된 텍스트를 복사합니다. ^c도 사용할 수 있지만, 이 방법이 더 안전합니다.

SendInput, [b]{ctrl down}v{ctrl up}[/b]
; 선택된 텍스트를 bbcode (forum) Bold 태그 안에 싸 넣습니다.

Return
; 핫키가 끝납니다. 이 아래의 코드는 실행되지 않습니다.

3 - 키 눌림 전송하기

그래서 이제 키들을 프로그램으로 전송(타자)하기로 결정합니다. Send 명령어를 사용하면 됩니다. 문자 그대로 키들을 전송합니다. 마치 키를 타자하거나 누른 것처럼 흉내 냅니다.

더 깊게 들어가기 전에, 먼저 약간의 일반적인 문제들을 다룹니다:
핫키처럼, Send에도 특수한 키가 있습니다. 아주 많습니다.
다음은 가장 많이 사용하는 심볼 네 가지입니다:

!: ALT 키를 전송합니다. 예를 들어, Send This is text!a는 "This is text" 키들을 누른 다음 ALT+a를 누른 것과 같습니다. 주의: !A 는 다른 프로그램에서는 !a와 전혀 다른 효과를 냅니다. 이것은 !A가 ALT+SHIFT+A를 누른 것인 반면 !a는 ALT+a를 누른 것이기 때문입니다. 잘 모르겠다면, 소문자를 사용하십시오.

+: SHIFT 키를 전송합니다. 예를 들어, Send +abC 는 텍스트 "AbC"를 전송하고, Send !+a는 ALT+SHIFT+a를 누릅니다.

^: CONTROL (Ctrl) 키를 전송합니다. 예를 들어, Send ^!a는 CTRL+ALT+a를 누른 것과 같고, Send ^{Home}은 CONTROL+HOME을 전송합니다. 주의: ^A는 어떤 프로그램에서 ^a와 전혀 다른 효과를 냅니다. 이것은 ^A가 CONTROL+SHIFT+A를 누른 것이고 ^a는 CONTROL+a를 누른 것이기 때문입니다. 잘 모르겠다면, 소문자를 사용하십시오.

#: WIN 키를 전송합니다 (윈도우즈 로고가 그려진 키) 그러므로 Send #e는 윈도우즈 키를 누른 다음 기호 "e"를 전송합니다.

다음 두 문단에서 전송 페이지에 관한 테이블에 관하여 언급합니다.

주의:
이 테이블은 핫키에 적용되지 않습니다. 핫키를 만들 때 CTRL 또는 ENTER (또는 기타 어떤 키이든) {} 안에 싸 넣지 못한다는 뜻입니다.

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

; 핫키를 만들 때...

; 잘못됨

{LCtrl}::

send, AutoHotkey

Return

; 올바름

LCtrl::

send, AutoHotkey

Return

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

; !가 {} 안에 있는 것에 주목하십시오. 그렇지 않으면 AHK가

; ALT 키를 눌러 버리기 때문입니다.

send, This text has been typed{!}

; 위와 같지만, 이 번에는 ENTER 키입니다. AHK는 "enter"를 타자해 버립니다...

; ... {} 안에 싸여 있지 않다면 말입니다.

send, Multiple enter lines have enter been sent. ; 잘못됨

send, Multiple{enter}lines have{enter}been sent. ; 올바름

또다른 문제는 사람들이 send 명령어에서 모든 것들은 괄호에 싸 넣어야 한다고 생각한다는 것입니다. 그렇지 않습니다. 표에 없으면 괄호가 필요하지 않습니다. 일반적인 기호와 숫자 심지어 어떤 심볼들은 괄호에 싸 넣을 필요가 없습니다

(예를 들어 {}'s.에서 점)
또한, Send 명령어로 1 개 이상의 기호나 숫자 또는 심볼을 단 번에 보낼 수 있습니다. 그래서 1 개의 기호마다 따로따로 수 많은 Send 명령어를 사용할 필요가 없습니다.

; 위에 언급한 테이블에 없는 기호나 단어들을 따로 괄호에 싸 넣지 마시오.

send, {a} ; 잘못됨

send, {b} ; 잘못됨

send, {c} ; 잘못됨

send, {a}{b}{c} ; 잘못됨

send, {abc} ; 잘못됨

send, abc ; 올바름

키를 누르거나 떼려면, 키 이름을 괄호로 둘러 싸고 UP이나 DOWN을 사용합니다.

; 다음은 키 하나를 누름과 동시에 또다른 키 (또는 키들)을 누르는 방법입니다.

; 한가지 방법이 작동하지 않으면, 다른 방법을 시도해 보십시오.

S

end, ^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 ; 일 초 동안 누르고 있습니다.

Send, {Up up} ; 위 화살표 키를 뗍니다.

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

send,

(

첫 번째 줄

두 번째 줄

원하는 만큼 줄을 배치할 수 있습니다.

)

주의: 다양한 형태의 전송 방법이 있습니다. 각자 따로 특별한 특징이 있습니다. 이 중에 하나로 여러분의 필요를 충족하지 못하면, 또다른 종류의 전송 형태를 시도해 봅니다. 그냥 명령어 이름을 "send"에서 "sendPlay" 또는 원하는 아무것이나 시도해 봅니다.
다음은 텍스트를 전송하는 가장 흔한 방법입니다:

Send
SendRaw
SendInput
SendPlay
SendEvent
각자 어떤 일을 하는지에 관한 더 자세한 정보는 여기를 읽어 보십시오.

a. 게임

중요합니다!
많은 게임은, 특히 현대의 게임은, 속이는 것을 방지하는 기능이 있습니다. 예를 들어, 이런 종류의 게임으로는 GameGuard, Hackshield, PunkBuster, 등등이 있습니다. 게임이 속임 방지 시스템이 있고 핫키와 핫스트링 그리고 send 명령어가 작동하지 않는다면, 안타까운 일입니다.
이런 시스템을 우회하는 일은 게임사의 정책을 위반하는 것이며 그러면 여러분은 제명 당할 수 있습니다. 해결책은 대단히 복잡합니다. 어떤 게임에서는 작동의 기회를 높일 수 있는 방법이 있지만, 마법의 "당장 게임에서 작동하라" 버튼은 없습니다. 그래서 포기하기 전에 이 모든 것들을 시도해 보십시오.

DirectX와 관련된 문제도 있습니다. 문제가 있고 게임이 DirectX를 사용한다면, 아래의 방법을 시도해 보십시오. 가능하면 창(Windowed 역주: 입력 방식을 전적으로 운영체제에 맡김) 모드에서 시험해 보십시오. 그러면 DirectX 문제가 해결될 지도 모릅니다.
픽셀이나 이미지 명령어를 사용할 때, DirectX 문제가 더 많이 일어날 수도 있습니다. 어떤 색을 얻으려고 시도하는지에 상관없이 색깔이 검정색으로 바뀔 수 있습니다 (0x000000). 그것은 해결하기 어려운 또다른 문제입니다. 되도록이면 Windowed 모드에서 실행해 보십시오.

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

FAQ 페이지에서 인용합니다:
어떤 게임은 DirectInput를 단독으로 사용합니다. 그 부작용으로, 모든 시뮬레이션 키눌림과 마우스 클릭을 무시해 버립니다. 이를 해결하려면, 다음 중 하나를 (또는 조합해서) 시도해 보십시오:

  • 다음을 통하여 SendPlay를 사용합니다. :

1) SendPlay 명령어를 사용합니다;

2) SendMode를 사용합니다; 그리고/또는

3) 핫스트링 옵션인 SP를 사용합니다.

  • SetKeyDelay의 지연시간을 늘려 봅니다. 예를 들어:
  • SetKeyDelay, 0, 50
  • SetKeyDelay, 150, 150, Play
  • ControlSend를 시도해 봅니다. 다른 Send 모드가 모두 실패하더라도 이 방법은 작동할 가능성이 있습니다.

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

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

; 프로그램을 실행합니다. 주의: 대부분의 프로그램은 전체 파일 경로를 요구합니다.

Run, %A_ProgramFiles%\Some_Program\Program.exe

; 웹 사이트를 실행합니다

Run, https://autohotkey.com

명령어-줄 매개변수와 CLSID와 같은 다른 고급 특징들도 역시 있습니다.
더 알고 싶다면 Run페이지를 참조합니다.

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

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

Run, Notepad.exe

Run, MsPaint.exe

; 내장 AHK 변수 를 사용하여 "My Documents" 폴더를 엽니다.

Run, %A_MyDocuments%

; 웹 사이트를 실행합니다

Run, https://autohotkey.com

Run, http://www.google.com

더 깊은 정보와 더 많은 예제는 다음을 참조합니다:
commands/Run.htm.

5 - 명령어 vs. 함수

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

도움이 되는 링크:
모든 명령어 목록: commands/index.htm
모든 내장 함수 목록: Functions.htm#BuiltIn

명령어

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

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

Msgbox, Hello Run, Notepad.exe ; 잘못됨

Msgbox, Hello, Run, Notepad.exe ; 잘못됨

Msgbox, Hello ; 올바름

Run, Notepad.exe

명령어는 또 "전통적인 구문"을 사용한다는 점에서 함수와 다릅니다. 그 의미는: 변수를 사용할 때, 그 둘레에 %를 사용할 필요가 있다는 뜻입니다. %variable%. 텍스트와 숫자는 "인용 부호" 안에 있을 필요가 없습니다: 예, 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("I'm scripting, awesome!", 16)

함수는 명령어와 다르게 보통 값을 돌려줍니다. 명령어는 OutputVar 매개변수가 필요하지만, 함수는 그렇지 않습니다. 변수를 함수의 값에 할당하는 가장 일반적인 방식은 다음과 같습니다:
MyVariable:=Function(Parameters)

MyVariable:=SubStr("I'm scripting, awesome!", 16)

이것만이 유일한 방법은 아닙니다. 그러나 가장 많이 사용되는 방법입니다. MyVariable 변수를 :=의 오른쪽에 있는 함수의 값으로 할당하고 있습니다 (이 경우, SubStr(...)).
함수에 관하여 더 자세한 것은 여기를 참조합니다.

짧게 말해:

; 다음은 명령어입니다

Msgbox, 이것은 텍스트입니다.

StringReplace, Output, Input, AutoHotKey, AutoHotkey, ALL

SendInput, 이거 정말 굉장하네요{!}{!}{!}

; 다음은 함수입니다

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

FileExist(VariableContainingPath)

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

a. 코드 블록

코드 블록은 활괄호 안에 있는 것들입니다 ({ 그리고 }). 한 그룹의 단위로 묶어 주므로 AutoHotkey는 그것을 함께 있어야 하는 하나의 커다란 가족으로 인식합니다. If 그리고 Loop와 함께 가장 많이 사용됩니다. 이것이 없다면, 블록에서 첫 줄만 호출됩니다.

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

if (var=5)

{

MsgBox, var equals %var%!!

Exitapp

}

다음 코드에서, msgbox는 var가 5일 경우에만 보입니다. 코드는 var가 5가 아닐지라도 언제나 스크립트는 종료합니다.

if (var=5)

MsgBox, var는 %var%와 같습니다!!

Exitapp

이것은 첫 번째 줄의 코드와 연관되어 있을 경우에만 완벽하게 좋습니다. 정확하게 위와 똑같지만, 두 번째 줄은 내어 썼으므로 if와 분할되어 있음을 알 수 있습니다.

if (var=5)

MsgBox, var는 %var%와 같습니다!!

MsgBox, 이제 if 서술문 '밖에' 있습니다. 아래에 한 줄만 있기 때문에 {}이 필요하지 않습니다.

6 – 변수

변수는 작은 포스트잇 메모지처럼 그 안에 정보를 담습니다. 텍스트나, 숫자, 그리고 함수나 명령어 심지어 수학 방정식으로부터 얻은 데이터를 저장하는 데 사용합니다. 변수가 없다면 프로그래밍 & 스크립팅은 정말 짜증나는 일이 될 것입니다.

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

  1. variable=text

가장 간단한 형태로, 전통적인 할당 방식입니다. 그냥 텍스트를 타자해 넣으면 그걸로 끝입니다.

  2. variable=%variable2%

위와 같지만, 변수를 다른 변수 값에 할당하고 있습니다.

  3. variable:="text"

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

  4. variable:=variable2

표현식 모드에서 변수는 %가 필요하지 않습니다.

  5. variable:=6+8/3*2-sqrt(9)

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

숫자 1 & 2 를 결합해 사용할 수 있습니다. var=%var2% some text %var3%.
3, 4 & 5 도 역시 결합할 수 있습니다. var:="The value of 5+ " Variable " is: " 5+Variable

앞에 심볼이 있는 모든 등호 기호(=)는 할당 연산자라고 부릅니다. 언제나 표현식입니다. ] 그래서 := += -= .= 등등은 언제나 표현식을 사용합니다.

a. 퍼센트 기호를 사용해야 할 때

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

%를 사용해야 할 때:

  1. 명령어를 사용할 때 (위 참조) 퍼센트 기호를 사용합니다.
    --     매개변수가 OutputVar이거나 InputVar일 경우는 제외합니다.
  2. 전통적인 모드를 사용하는 변수에 변수를 할당할 때 (앞에 심볼이 없는 등호 기호).

%를 사용하면 안될 때:

  1. 매개변수가 입력변수이거나 출력 변수일 경우, 예를 들어: StringLen, OutputVar, InputVar
  2. 할당의 왼쪽에 있을 때: Var = 123abc
  3. 전통적 (비-표현식) if-서술문의 왼쪽에: If Var1 < %Var2%
  4. 표현식 안에. 예를 들어:

If (Var1 != Var2)

Var1 := Var2 + 100

b. 사용자 입력 얻기

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

InputBox, OutputVar, Question 1, 이름이 무엇입니까?

if (OutputVar="Bill")

MsgBox, 멋진 이름이군요, %OutputVar%.

InputBox, OutputVar2, Question 2, AutoHotkey를 좋아합니까?

if (OutputVar2="yes")

MsgBox, %OutputVar2%`라고 답해 주셔서 고맙습니다. %OutputVar%! 여러분의 훌륭한 친구가 되어 드리겠습니다.

else

MsgBox, %OutputVar%`, 정말 슬프군요.

c. 다른 예제들?

MsgBox, 4, , 계속하시겠습니까?

IfMsgBox, No

Return ; No 이면, 코드를 멈춥니다.

MsgBox 당신은 YES를 눌렀습니다. ; 그렇지 않으면, 사용자는 yes를 고른 것입니다.

; 퍼센트 기호를 사용해야 할 때와 하지 말아야 할 때는 보여주는 몇 가지 예들

Variable=text ; 변수에 텍스트를 할당합니다. '전통적인' 할당방식입니다.

VariableNumber:=6 ; 변수에 숫자를 할당합니다. '표현식' 할당입니다.

Variable2=%Variable% ; 변수를 또다른 변수에 할당합니다. 전통적인 할당을 사용합니다.

Variable3:=Variable ; 변수를 또다른 변수에 할당합니다. 표현식 할당입니다.

Variable4.=Variable ; 변수를 또다른 변수의 끝에 추가합니다. 표현식 할당입니다.

Variable5+=VariableNumber ; 변수의 값을 또다른 변수에 추가합니다. 표현식 할당입니다.

Variable5-=VariableNumber ; 변수의 값을 또다른 변수로부터 뺍니다. 표현식 할당입니다.

Variable6:=SubStr(Variable, 2, 2) ; 함수 안의 변수입니다. 이것은 언제나 표현식 할당입니다.

Variable7=%Variable% Text ; 변수를 또다른 변수에 약간의 텍스트오 함께 할당합니다. 전통적인 할당을 사용합니다.

Variable8:=Variable " Text" ; 변수를 또다른 변수에 약간의 텍스트와 함께 할당합니다. 표현식 할당을 사용합니다.

MsgBox, %Variable% ; 명령어 안의 변수입니다.

StringSplit, Variable, Variable, x ; InputVar 와 OutputVar를 사용하는 명령어 안의 변수입니다.

if (VariableNumber=6) ; IF 에 괄호가 있을 때마다, 그것은 표현식입니다. 그래서 %를 사용하지 않습니다.

If (Variable != VariableNumber) ; IF 에 괄호가 있을 때마다, 그것은 표현식입니다. 그래서 %를 사용하지 않습니다.

if VariableNumber=6 ; 괄호가 없으면, 그 if는 전통적입니다. 그렇지만, '오른쪽에 있는' 변수만 %가 필요합니다.

If Var1 < %Var2% ; 괄호가 없으면, 그 if는 전통적입니다. 그렇지만, '오른쪽에 있는' 변수만 %가 필요합니다.

7 – 객체

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

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

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

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

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

  1. 번호 리스트를 사용하고 싶습니다. 예를 들어, 장보기 목록 같은 경우이겠지요 (이것은 인덱스 배열이라고 지칭됩니다)
  2. 격자를 표현하고 싶습니다. 아마도 보드 게임에 사용하실 생각이겠지요 (이것은 내포 객체로 만들 수 있습니다)
  3. 각각에 이름이 있는 물품 목록이 있습니다. 예를 들어 과일의 특징에 맞추어 이름을 적용할 수 있습니다 (이것은 연관 배열이라고 부릅니다)

a. 객체 만들기

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

  1. MyObject := ["one", "two", "three", 17]

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

  2. Banana := {"Shape": "Elongated", "Color": "Yellow", "Taste": "Delicious", "Price": 3}

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

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

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

  4. Banana := Object("Shape", "Elongated", "Color", "Yellow", "Taste", "Delicious", "Price", 3)

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

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

b. 객체 사용하기

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

값을 설정하려면:

객체에 값을 설정하는 일은 변수에 값을 설정하는 것 만큼이나 단순합니다.
그냥 (반환 섹션에서 보시듯이) 표현식 할당 심볼 :=의 왼쪽에.
각괄호나 점 표기법을 배치하기만 하면 됩니다.

예를 들어:
Banana.Consistency := "Mushy"
Banana["Pickled"] := True ; 이 바나나는 절인 바나나입니다. 우웩.

값을 반환하려면:

  1. Value := Banana["Color"]

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

  2. Value := Banana.Color

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

새 키와 값을 추가하려면:

  1. 직접적으로 값을 추가하기

직접적으로 키와 값을 추가하려면, 그냥 존재하지 않는 키를 설정하기만 하면 됩니다. 예를 들어:
MyObject.NewKey := "Shiny"
MyObject["NewerKey"] := 3.1415

  2. 값을 삽입하기

객체에 키와 값을 추가하는 또다른 방법은 다음 방법 중 하나를 사용합니다.

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

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

키와 값을 삭제하려면:

  1. 값을 제거하기.

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

  2. 키를 제거하기

키와 값을 제거하는 몇 가지 다른 방법이 있습니다:

    1. RemovedValue := MyObject.Delete(AnyKey)

MyObject[AnyKey]의 이전 값은 RemovedValue에 저장됩니다.

    2. NumberOfRemovedKeys := MyObject.Delete(FirstKey, LastKey)

이런식으로 제거하면 FirstKey와 LastKey 사이의 숫자/정수 또는 문자열 키를 몽땅 제거할 수 있습니다.

돌려받는 값은 제거된 키의 개수입니다. 이것은 키 사이에 틈이 있을 때 유용합니다 (예를 들어, 키를 1부터 4까지 지정했지만, 키 2는 존재하지 않는다면, NumberOfRemovedKeys가 3으로 설정되고 세 개의 키만 제거됩니다)

    3. MyObject.Pop()

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

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

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

8 - 기타 등등 도움

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

a. 신비한 []

문서를 통하여, 다음 두 심볼이 보일 겁니다 ([ 그리고 ]). 거의 모든 페이지 상단에 노란색 구문 박스 안에서 코드를 둘러 싸고 있지요. 이 각활호 안에 든 모든 것들은 선택적입니다. 그 안에 든 것들은 필요 없으면 생략해도 된다는 뜻입니다. 코드를 작성할 때, [] 는 절대로 타자하지 않습니다.

ControlGetText 페이지에서 이것을 보실 수 있습니다 (색깔 없이):
ControlGetText, OutputVar [, Control, WinTitle, WinText, ExcludeTitle, ExcludeText]

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

또는 좀 더 세밀하게 이렇게 해도 됩니다:
ControlGetText, OutputVar, Control, WinTitle

ExcludeTitle를 사용하고 싶지만 WinText나 WinTitle은 채우고 싶지 않다면? 간단합니다!
ControlGetText, OutputVar, Control,,, ExcludeTitle

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

b. AHK 버전 알아내기

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

MsgBox, %A_AHKVersion%

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

c. 시행 착오

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

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

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

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

d. 들여쓰기

들여쓰기는 아주 중요합니다! 코드는 완벽하게 실행되지만, 코드를 읽을 때 심각한 두통거리가 될 것입니다. 작은 코드라면 (25 줄 이하) 아마도 들여쓰기가 없더라도 읽는데 문제가 없겠지만, 조만간 어려워질 겁니다. 되도록이면 빠리 들여쓰기를 배우는 편이 제일 좋습니다.
들여쓰기는 특별한 스타일이 없지만, 일관성을 유지하는 것이 제일 좋습니다.
"들여쓰기란 무엇인가?" 아마도 이렇게 묻고 싶겠지요? 무엇이 무엇에 속해 있는지 보기 위해 코드를 간격을 두어 쪼개는 것입니다. 사람들은 한 레벨 당 보통 3 이나 4 개의 공백 또는 한 개의 탭을 사용합니다.

들여쓰기 없음:

if (car="old")

{

msgbox, the car is really old

if (wheels="flat")

{

msgbox, this car is not safe to drive.

Return

}

else

{

msgbox, Be careful! This old car will be dangerous to drive.

}

}

else

{

msgbox, My`, what a shiny new vehicle you have there.

}

들여쓰기함:

if (car="old")

{

msgbox, 자동차가 정말 오래되었습니다

if (wheels="flat")

{

msgbox, 이 자동차는 운전하기에 안전하지 않습니다.

Return

}

else

{

msgbox, 주의하세요! 이 구형 자동차는 운전하기에 위험합니다.

}

}

else

{

msgbox, 와우`, 정말 멋진 자동차를 가지셨군요.

}

Wiki에 다양한 스타일과 예제가 있습니다. 여러분이 읽기에 가장 쉽다고 생각하는 스타일을 골라 들여쓰기 하는 법을 배우십시오.
http://en.wikipedia.org/wiki/Indent_style

e. 도움 요청하기

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

  • 두려워 하지 말고 도움을 청합니다. 가장 똑똑한 사람들조차 다른 이에게 도움을 구합니다.
  • 무엇을 시도하고 있는지 두려워 하지 말고 보여줍니다. 심지어 말도 안 되는 것이라고 생각할지라도 말입니다.
  • 시도해 본 것들을 모두 게시합니다.
  • 여러분을 제외하고 누구든 멍청해서 아무것도 모른다고 생각하십시오. 되도록이면 많은 정보를 주어서 바보들에게 무엇을 하려고 하는지 일깨워 주십시오. 우리를 돕는 것이 바로 여러분을 돕는 것입니다.
  • 인내 하십시오.
  • 정중 하십시오.
  • 다음을 여십시오.
  • 친절 하십시오.
  • 즐기십시오

바로 답을 얻지 못하더라도, 적어도 하루 (24 시간)은 기다린 후에 도움을 더 요청합니다. 우리도 기꺼이 도와주고 싶지만, 시간이 나야 도와줄 수 있습니다. 일을 하고 있을 수도 있고, 잠자거나, 게임하거나, 가족과 함께이거나 아니면 그냥 바쁠 수 있습니다.
도움을 기다리는 동안, 스스로 시도하면서 배울 수 있습니다. 도움없이 스스로 뭔가를 이루면 큰 보람을 느끼실 것입니다.

f. 다른 링크들

자주 묻는 질문들 (FAQ)


FAQ(자주 묻는 질문)


명령어 및 함수목록

더 자세한 정보는 함수나 명령어 이름에 클릭하십시오. 자주 사용하는 엔트리들은 큰 글꼴로 표시했습니다.

엔트리

설명

{ ... } (블록)

한 쌍의 반괄호는 블록을 나타냅니다. 블록은 전형적으로 함수, Else, Loop, While-loop, 그리고 IF-명령어와 함께 사용됩니다.

{ ... } / Object()

스크립트가 가능한 연관 배열을 생성합니다.

[ ... ] / Array()

스크립트가 가능한 연관 배열을 정수 키로 생성합니다.

Abs()

숫자 의 절대값을 반환합니다. (음수→양수, 양수→그대로)

AutoTrim

Var1 = %Var2% 서술문에서 Var2의 처음과 끝에 탭과 스페이스를 생략할지를 설정합니다.

ASin()

아크사인 값을 반환합니다. (Number는 사인 값).

ACos()

아크코사인 값을 반환합니다. (Number는 코사인 값).

ATan()

아크탄젠트 값을 반환합니다. (Number는 탄젠트 값).

BlockInput

사용자가 키보드와 마우스를 통하여 컴퓨터와 대화하도록 켜거나 끕니다.

Break

루프(loop)를 빠져 나옵니다. 모든 종류의 루프(loop) 안에서 유효합니다.

Catch

try 서술문을 실행하는 동안에 에러가 일어나면 실행할 코드를 지정합니다.

Ceil()

Number 는 가장 가까운 정수로 올림됩니다 (.00 버림).

Click

지정된 좌표에 마우스 버튼을 클릭합니다. 마우스 버튼을 누르거나, 마우스 휠을 돌리거나, 또는 마우스를 이동할 수 있습니다.

ClipWait

클립보드에 데이터가 들어올 때까지 기다립니다.

ComObjActive()

등록된 COM 객체를 반환합니다.

ComObjArray()

COM에 사용할 안전배열을 생성합니다.

ComObjConnect()

COM 객체의 이벤트 소스를 주어진 접두사를 가진 함수들에 연결합니다.

ComObjCreate()

COM 객체를 생성합니다.

ComObjEnwrap() / ComObjUnwrap()

COM 객체를 싸거나 풉니다.

ComObjError()

COM 에러의 고지를 켜거나 끕니다.

ComObjFlags()

COM 포장자 객체의 행위를 제어하는 플래그를 반환하거나 변경합니다.

ComObjGet()

COM 컴포넌트가 제공하는 객체의 참조 주소를 돌려줍니다.

ComObjMissing()

COM 메쏘드에 건넬 "missing parameter" 객체를 만듭니다.

ComObjParameter()

값과 유형을 싸서 매개변수로 COM 메쏘드에 건넵니다.

ComObjQuery()

COM 객체에 인터페이스나 서비스를 질의합니다.

ComObjType()

COM 객체에서 유형 정보를 반환합니다.

ComObjValue()

COM 포장자 객체에 저장된 값이나 포인터를 반환합니다.

Continue

현재 남아 있는 루프(loop) 반복을 건너뛰고 다시 새로 루프(loop)를 시작합니다. 모든 종류의 루프(loop) 안에서 유효합니다.

Control

컨트롤의 속성을 변경 합니다.

ControlClick

컨트롤에 마우스 버튼 이벤트나 마우스 휠 이벤트를 보냅니다.

ControlFocus

윈도우창의 특정 컨트롤에 입력포커스를 이동합니다.

ControlGet

컨트롤에 관하여 다양한 유형 정보를 반환합니다.

ControlGetFocus

목표 창에서 어느 컨트롤이 입력포커스를 가지고 있는지 반환합니다.

ControlGetPos

컨트롤의 위치와 크기를 반환합니다.

ControlGetText

컨트롤에서 텍스트를 반환합니다.

ControlMove

컨트롤을 이동하거나 크기를 바꿉니다.

ControlSend / ControlSendRaw

시뮬레이트 키를 창이나 컨트롤에 전송합니다.

ControlSetText

컨트롤의 텍스트를 바꿉니다.

CoordMode

다양한 명령어에 대하여 좌표 모드를 활성 창이나 화면에 상대적으로 설정합니다.

Cos()

숫자 의 삼각함수 코사인을 돌려줍니다 .

Critical

현재 쓰레드가 다른 스레드에 인터럽트를 당하지 않도록 방지하거나, 인터럽트 되도록 허용합니다.

DetectHiddenText

창에서 보이지 않는 텍스트를 "보여줄지 말지" 결정합니다. 창을 찾는 목적에 사용할 수 있습니다. 이 명령어는 IfWinExist와 WinActivate 같은 명령어에 영향을 미칩니다.

DetectHiddenWindows

보이지 않은 창을 스크립트에 "보여줄지 말지" 결정합니다.

DllCall()

표준 Windows API 함수와 같은, DLL 안의 함수를 호출합니다.

Drive

CD 드라이브나 DVD 드라이브의 트레이를 꺼내거나 넣습니다. 또는 드라이브의 볼륨 라벨을 설정합니다.

DriveGet

컴퓨터의 드라이브에 관하여 다양한 유형의 정보를 반환합니다.

DriveSpaceFree

드라이브의 여유 공간을 메가 바이트 단위로 반환합니다.

Edit

현재 스크립트를 편집하기 위해 연관 편집기에 엽니다.

Else

IF-서술문이 FALSE로 평가되면 수행할 명령어(들)을 지정합니다. 명령어가 두 개 이상 존재하면, 블록 (괄호)에 둘러 싸 넣으십시오.

EnvAdd

주어진 값을 변수에 더해 자기 자신에 할당합니다. (날짜-시간 값에서 더하거나 뺄 수도 있습니다). 다음과 동등합니다: Var += Value.

EnvDiv

변수를 주어진 값으로 나누어서 자기 자신에 할당합니다: Var /= Value.

EnvGet

환경 변수를 반환합니다.

EnvMult

변수를 주어진 값만큼 곱해서 자기 자신에 할당합니다. 다음과 동등합니다: Var *= Value.

EnvSet

환경에 담긴 변수에 값을 씁니다.

EnvSub

주어진 값을 변수에서 빼서 자기 자신에 할당합니다 (날짜-시간 값을 비교하는 데에도 사용할 수 있습니다). 다음과 동등합니다: Var -= Value.

EnvUpdate

OS는 물론 실행 중인 모든 어플리케이션에 환경 변수가 바뀌었음을 고지합니다.

Exit

현재 쓰레드를 빠져 나오거나 (스크립트가 영속적이 아니고 핫키도 전혀 없다면) 전체 스크립트를 끝냅니다.

ExitApp

스크립트를 무조건 종료합니다.

Exp()

e (대략 2.71828182845905)를 N 만큼 제곱해서 돌려줍니다.

FileAppend

텍스트를 파일 끝에 씁니다 (필요하면, 먼저 파일을 생성합니다).

FileCopy

파일을 복사합니다.

FileCopyDir

폴더를 복사합니다. 그의 하위 폴더와 파일도 함께 복사됩니다 (xcopy와 유사).

FileCreateDir

폴더를 생성합니다.

FileCreateShortcut

단축 파일을 생성합니다 (.lnk).

FileDelete

파일을 삭제합니다.

FileEncoding

FileRead, FileReadLine, Loop Read, FileAppend, 그리고 FileOpen에 대하여 기본 파일 인코딩을 설정합니다.
다음도 참조하십시오: 텍스트 인코딩

FileInstall

지정한 파일을 스크립트의 컴파일 버전에 포함시킵니다.

FileGetAttrib

파일이나 폴더가 읽기 전용인지, 숨은 파일인지 등등의 속성을 보고합니다.

FileGetShortcut

단축 파일에 관한 정보를 반환합니다(.lnk). 예를 들어 그의 목표 파일.

FileGetSize

파일의 크기를 반환합니다.

FileGetTime

파일이나 폴더의 날짜시간 도장을 반환합니다.

FileGetVersion

파일의 버전을 반환합니다.

FileMove

파일을 이동하거나 이름을 바꿉니다.

FileMoveDir

폴더를 그의 하위 폴더 파일과 함께 이동합니다. 폴더 이름을 바꿀 수도 있습니다.

FileOpen

객체-지향적 파일 I/O를 제공합니다.

FileRead

파일의 내용을 변수 안으로 읽어 들입니다.

FileReadLine

지정된 줄을 파일로부터 읽어 그 텍스트를 변수에 저장합니다.

FileRecycle

파일이나 디렉토리를 휴지통으로 보냅니다.

FileRecycleEmpty

휴지통을 비웁니다.

FileRemoveDir

폴더를 삭제합니다.

FileSelectFile

사용자가 파일을 열거나 저장할 수 있도록 표준 대화상자를 보여줍니다.

FileSelectFolder

사용자가 폴더를 선택할 수 있도록 표준 대화상자를 보여줍니다.

FileSetAttrib

파일이나 폴더의 속성을 변경합니다. 와일드카드를 지원합니다.

FileSetTime

파일이나 폴더의 날짜시간 도장을 변경합니다. 와일드카드를 지원합니다.

Finally

Try 서술문이 끝나면, 한 블록의 코드가 언제나 확실하게 실행되도록 합니다.

Floor()

숫자 를 가장 가까운 정수로 버림한 다음 돌려줍니다 ( .00을 버림).

For

객체 안의 키-값 한 쌍마다 일련의 명령어를 반복합니다.

Format

가변 개수의 입력 값을 포맷 문자열에 맞게 포맷합니다.

FormatTime

YYYYMMDDHH24MISS 타임스탬프를 지정된 날짜/시간 형식으로 변형합니다.

Func()

함수를 가리키는 참조주소를 반환합니다.

GetKeyName()
GetKeyVK()
GetKeySC()

가상 키 코드 또는 키의 스캔 코드의 이름 또는 텍스트를 반환합니다.

GetKeyState

키보드 키나 마우스/조이스틱 버튼이 눌러 있는지 뗀 상태인지 점검합니다. 또 조이스틱의 상태를 반환합니다.

Gosub

지정된 라벨로 점프해서 Return을 만날 때까지 실행을 계속합니다.

Goto

지정된 라벨로 점프해 실행을 계속합니다.

GroupActivate

GroupAdd로 정의된 창 그룹에서 다음 창을 활성화합니다.

GroupAdd

창을 창 그룹에 추가합니다. 필요하면 창 그룹을 생성합니다.

GroupClose

바로 전에 GroupActivate나 GroupDeactivate에 의하여 활성화되었던 활성 창을 닫습니다 . 그 다음에 연속적으로 그 다음 창을 활성화합니다. 그룹에 있는 모든 창을 닫을 수도 있습니다.

GroupDeactivate

GroupActivate와 비슷합니다. 단 그룹에 없는 다음 창을 활성화한다는 점이 다릅니다.

Gui

창과 컨트롤을 생성하고 관리합니다. 만든 창은 데이터 입력 폼이나 맞춤 사용자 인터페이스에 사용할 수 있습니다.

GuiControl

구이 창의 컨트롤에 다양한 변경을 합니다.

GuiControlGet

구이 탕의 컨트롤에 관하여 다양한 유형의 정보를 반환합니다.

Hotkey

스크립트가 실행 중인 동안, 핫키를 생성, 변경, 활성화, 또는 불능화합니다.

if

변수를 변수에 비교해 TRUE로 평가되면 수행할 명령어(들)을 지정합니다. 두 개 이상 명령어가 존재하면, 블록 (반괄호) 안에 싸 넣으십시오.

if (expression)

표현식이 TRUE로 평가될 때 수행할 명령어(들)을 지정합니다.

If var [not] between

변수의 내용이 숫자 순서로 또는 알파벳 순서로 두 값 사이에 (포함) 있는지 점검합니다.

If var [not] in/contains MatchList

변수의 내용이 리스트 안의 항목에 부합하는지 점검합니다.

If var is [not] type

변수의 내용이 숫자인지, 대문자인지 등등을 점검합니다.

IfEqual / IfNotEqual

변수가가 값과 같은지 비교합니다. 다음과 동등합니다: if Var = Value | if Var <> Value.

IfExist / FileExist()

파일이나 폴더가 존재하는지 점검합니다.

IfGreater / IfGreaterOrEqual

변수를 값에 비교합니다. 다음과 동등합니다: if Var > Value | if Var >= Value.

IfInString / InStr()

변수에 지정된 문자열이 포함되어 있는지 점검합니다.

IfLess / IfLessOrEqual

변수를 값에 비교합니다. 다음과 동등합니다: if Var < Value | if Var <= Value.

IfMsgBox

가장 최근의 MsgBox 명령을 수행하는 동안 사용자가 어느 버튼을 눌렀는지 점검합니다.

IfWinActive / IfWinNotActive

지정된 창이 존재하는지 그리고 현재 활성 상태 (전경)인지 점검합니다.

IfWinExist / IfWinNotExist

지정된 창이 존재하는지 점검합니다.

ImageSearch

화면에서 이미지를 검색합니다.

IniDelete

표준 형식의 .ini 파일로부터 값을 지웁니다.

IniRead

표준 형식의 .ini 파일로부터 값을 읽습니다.

IniWrite

표준 형식의 .ini 파일에 값을 씁니다.

Input

사용자가 문자열을 타자하기를 기다립니다.

InputBox

입력 박스를 보여주고 사용자가 문자열을 타자해 넣기를 요구합니다.

InStr()

주어진 문자열이 나타나는지 왼쪽에서 오른쪽으로 검색합니다.

IsByRef()

ByRef 매개변수에 값이 주어졌는지 결정합니다.

IsFunc()

함수를 동적으로 호출할 수 있는지 알려줍니다.

IsLabel()

주어진 값이 라벨에 존재하는지 점검합니다.

IsObject()

값이 객체인지 결정합니다.

KeyHistory

스크립트 정보 그리고 가장 최근의 키눌림과 마우스 클릭의 이력을 보여줍니다.

KeyWait

키나 마우스/조이스틱 버튼을 누를 때까지 또는 뗄 때까지 기다립니다.

ListHotkeys

현재 스크립트가 사용 중인 핫키들을 화면에 보여줍니다. 그들의 서브루틴이 현재 실행 중인지, 그리고 키보드 갈고리나 마우스 갈고리를 사용중인지 아닌지 알려줍니다.

ListLines

가장 최근에 실행된 스크립트 줄을 화면에 보여줍니다.

ListVars

스크립트의 변수들을 보여줍니다: 이름과 현재 내용.

Log()

숫자 의 상용 로그를 돌려줍니다 (밑수 10).

Ln()

숫자 의 자연 로그를 돌려줍니다 (밑수 e).

Loop (보통)

일련의 명령어들을 반복적으로 수행합니다: 지정된 횟수만큼 또는 break를 만날 때까지.

Loop (파일 & 폴더)

지정된 파일이나 폴더를 한 번에 하나씩 반환합니다.

Loop (문자열 파싱)

문자열로부터 서브스트링(필드)를 한 번에 하나씩 파싱합니다.

Loop (파일 내용 읽기)

텍스트 파일에서 줄을 한 번에 한 줄씩 반환합니다 (FileReadLine보다 수행성능이 더 좋습니다).

Loop (레지스트리)

지정된 레지스트리 서브키의 내용을 한 번에 하나씩 반환합니다.

Menu

메뉴와 메뉴 항목을 생성, 삭제, 변경 그리고 보여줍니다. 트레이 아이콘과 그의 툴팁을 변경합니다. 컴파일된 스크립트의 메인 창을 열지 말지 제어합니다.

Mod()

나머지(Modulo) 연산입니다. 피젯수(Dividend)를 젯수(Divisor)로 나누고 나머지를 돌려줍니다.

MouseClick

마우스 버튼을 클릭하거나 누릅니다. 또는 마우스 휠을 돌립니다. 주의: Click 명령어가 일반적으로 더 유연하고 사용하기가 더 쉽습니다.

MouseClickDrag

지정된 마우스 버튼을 클릭하고 누릅니다. 마우스를 목표 좌표로 이동합니다. 그리고 마우스를 뗍니다.

MouseGetPos

마우스 커서의 현재 위치를 반환합니다. 그리고 선택적으로 어느 창과 컨트롤 위에 있는지 반환합니다.

MouseMove

마우스 커서를 이동합니다.

MsgBox

지정된 텍스트를 작은 창 안에 보여줍니다. 안에 버튼이 들어 있습니다 (예를 들어 Yes 그리고 No).

NumGet()

지정된 주소+오프셋에 저장된 이진 숫자를 반환합니다.

NumPut()

지정된 주소+오프셋에 이진 형태의 숫자를 저장합니다.

OnExit

스크립트가 종료할 대 자동으로 실행할 서브루틴을 지정합니다.

OnMessage()

스크립트가 지정된 메시지를 받을 때 자동으로 호출할 함수를 지정합니다.

OutputDebug

문자열을 (있다면) 디버거에 보내 보여줍니다.

Pause

스크립트의 현재 쓰레드를 정지합니다.

PixelGetColor

지정된 좌표에서 픽셀의 색을 반환합니다.

PixelSearch

화면 구역을 검색해 지정된 색을 가진 픽셀을 찾습니다.

PostMessage

메시지를 창이나 컨트롤의 메시지 큐에 넣습니다.

Process

프로세스에 다음 연산 중 하나를 수행합니다: 존재하는지 점검합니다; 우선순위를 변경합니다; 닫습니다; 끝나기를 기다립니다.

Progress

진척 사항 바를 담고 있는 창을 생성하거나 갱신합니다.

Random

의사-무작위 수를 생성합니다.

RegExMatch()

문자열에 패턴(정규 표현식)을 담을지 말지 결정합니다.

RegExReplace()

문자열 안에서 패턴 (정규 표현식)에 부합하는 것들을 교체합니다.

RegDelete

레지스트리에서 서브키나 값을 삭제합니다.

RegRead

값을 레지스트리에서 읽습니다.

RegWrite

값을 레지스트리에 씁니다.

RegisterCallback()

호출 될 때 머신-코드 주소를 생성해서, 그 호출을 스크립트의 함수로 방향전환합니다.

Reload

현재 실행중인 스크립트의 실체를 새로운 실체로 교체합니다.

Return

서브루틴으로부터 이전에 실행을 점프했던 곳으로 돌아갑니다. 함수-호출, Gosub, 핫키 활성화, GroupActivate, 기타 등등의 방법으로 점프했던 곳으로 돌아갑니다.

Round()

N 이 생략되거나 0이면, Number는 가장 가까운 정수로 버림됩니다. N이 양수이면, Number는N개의 십진 자리로 버림됩니다. N이 음수이면, Number는 소수점 왼쪽으로 N 자리수 만큼 버림됩니다.

Run

외부 프로그램을 실행합니다.

RunAs

이 다음부터 Run과 RunWait를 사용하기 위해 사용자 신용장 세트를 지정합니다.

RunWait

외부 프로그램을 실행하고 끝날 때까지 기다립니다.

Send / SendRaw / SendInput / SendPlay

시률레이트된 키눌림과 마우스 클릭을 활성 창에 전송합니다.

SendLevel

인위적인 키눌림과 마우스 이벤트를 핫키와 핫스트링이 무시할지 말지 제어합니다.

SendMessage

메시지를 창이나 컨트롤에 전송하고 승인을 기다립니다.

SendMode

기본 (SendEvent) 값이 아니라, Send를 SendInput이나 SendPlay와 동일하게 만듭니다. 또Click 그리고 MouseMove/Click/Drag가 지정된 메쏘드를 사용하도록 만듭니다.

SetBatchLines

얼마나 빨리 스크립트를 실행할지 결정합니다 (CPU 이용에 영향을 미칩니다).

SetCapslockState

Capslock 키의 상태를 설정합니다.강제로 온 또는 오프 상태를 유지할 수 있습니다.

SetControlDelay

각 컨트롤-변경 명령어 다음에 지연 시간을 설정합니다.

SetDefaultMouseSpeed

마우스 속도를 설정합니다. Click 그리고 MouseMove/Click/Drag에 지정되어 있지 않을 경우 유용합니다.

SetEnv (Var = Value)

지정된 값을 변수에 할당합니다.

SetFormat

수학 연산으로 생산돈 정수와 부동 소수점 수의 형식을 설정합니다.

SetKeyDelay

Send나 ControlSend로 키를 누른 후에 지연될 시간을 설정합니다.

SetMouseDelay

마우스 이동이나 클릭 후에 지연될 시간을 설정합니다.

SetNumlockState

Numlock 키의 상태를 설정합니다. 강제로 온 또는 오프 상태를 유지할 수 있습니다.

SetScrollLockState

Scrolllock 키의 상태를 설정합니다. 강제로 온 또는 오프 상태를 유지할 수 있습니다.

SetRegView

32-비트 스크립트에서 레지스트리 명령어가 64-비트 레지스트리 뷰에 접근하는 것을 그리고 그 반대를 허용합니다.

SetStoreCapslockMode

Send 후에 CapsLock의 상태를 복구할지 말지 결정합니다 .

SetTimer

서브루틴이 자동으로 그리고 반복적으로 지정된 시간 간격마다 기동되도록 만듭니다.

SetTitleMatchMode

WinWait와 같은 명령어와 같이, WinTitle 매개변수의 부합 행위를 설정합니다.

SetWinDelay

WinActivate와 같이, 각 창 명령어 다음에 지연 시간을 설정합니다.

SetWorkingDir

스크립트의 현재 작업 디렉토리를 변경합니다.

Shutdown

시스템을 닫거나, 재시작하거나 또는 로그오프 합니다.

Sin()

Number 의 삼각 사인 값을 돌려줍니다.

Sleep

지정된 시간 동안 기다린 다음 계속 진행합니다.

Sort

변수의 내용을 알파벳, 숫자, 또는 무작위 순서로 정렬합니다 (선택적으로 중복을 제거합니다).

SoundBeep

PC 스피커로 톤을 방출합니다.

SoundGet

사운드 장치로부터 다양한 설정을 반환합니다 (마스터 음소거, 마스터 볼륨 등등.)

SoundGetWaveVolume

사운드 장치로부터 웨이브 출력 볼륨을 반환합니다.

SoundPlay

사운드, 비디오, 또는 기타 지원되는 파일 유형을 연주합니다.

SoundSet

사운드 장치의 다양한 설정을 변경합니다 (마스터 음소거, 마스터 볼륨 등등.)

SoundSetWaveVolume

사운드 장치를 위해 웨이브 출력 볼륨을 변경합니다.

SplashImage

JPG, GIF, 또는 BMP 이미지를 담고 있는 창을 만들거나 갱신합니다.

SplashTextOn

맞춤 가능한 텍스트 팝업 창을 생성합니다.

SplashTextOff

위의 창을 닫습니다.

SplitPath

파일 이름이나 URL을 이름, 디렉토리, 확장자, 그리고 드라이브로 가릅니다.

Sqrt()

Number 의 평방근을 돌려줍니다.

StatusBarGetText

표준 상태 바 컨트롤로부터 텍스트를 반환합니다.

StatusBarWait

차의 상태 바에 지정된 문자열이 들어올 때까지 기다립니다.

StrPut() / StrGet()

문자열을 메모리 주소로 복사하거나 복사해 옵니다. 선택적으로 코드 페이지에 맞게 변환합니다.

StringCaseSense

문자열 비교에 대소문자를 구분할지 결정합니다. (기본값은 "대소문자를 구별하지 않습니다").

StringGetPos / InStr()

문자열 안에서 지정된 부분문자열의 위치를 반환합니다.

StringLeft

문자열의 왼쪽으로부터 여러 문자를 반환합니다.

StringLen / StrLen()

문자열에 들은 문자의 갯수를 반환합니다.

StringLower

문자열을 소문자로 변환합니다.

StringMid / SubStr()

문자열에서 지정된 위치로부터 하나 이상이 문자를 반환합니다.

StringReplace

지정된 부분문자열을 새 문자열로 교체합니다.

StringRight

문자열의 오른쪽으로부터 문자들을 반환합니다.

StringSplit

문자열을 지정된 가름자를 사용하여 부분 문자열 배열로 가릅니다.

StringTrimLeft

문자열의 왼쪽으로부터 문자들을 제거합니다.

StringTrimRight

문자열의 오른쪽으로부터 문자들을 제거합니다.

StringUpper

문자열을 대문자로 변환합니다.

Suspend

선택된 또는 모든 핫키와 핫스트링을 켜고 끕니다.

SysGet

화면 해상도, 다중-모니터 정보, 시스템 객체의 크기, 그리고 기타 시스템 특성을 반환합니다.

Tan()

Number 의 삼각 탄젠트를 돌려줍니다.

Thread

쓰레드의 우선순위 또는 인터럽트 허용 여부를 설정합니다. 임시로 모든 타이머를 끌 수도 있습니다.

Throw

에러가 일어났다는 신호를 보냅니다. 이 신호는 try-catch 서술문으로 잡을 수 있습니다.

ToolTip

언제나 최상위에 있는 창을 화면 어디든지 만듭니다.

Transform

잡다한 수학 기능, 비트별 연산, 그리고 ASCII/유니코드 변환 같은 작업을 수행합니다.

TrayTip

풍선 메시지를 트레이 아이콘 근처에 만듭니다.

Trim

문자열의 앞/뒤에서 문자들을 걷어냅니다.

Try

하나 이상의 서술문 (명령어나 표현식)을 throw 명령어가 던지는 실행시간 에러와 예외로부터 보호합니다.

Until

Loop 또는 For-루프(loop)에 조건을 적용합니다.

UrlDownloadToFile

인터넷으로부터 파일을 내려받습니다.

Var = value

지정된 값을 변수에 할당합니다.

Var := expression

표현식을 평가해서 그 결과를 변수에 저장합니다.

VarSetCapacity()

변수의 가용 능력을 확대하거나 그의 메모리를 풀어줍니다. 보통, 이것은 DllCall과 같이 비정상적인 상황에서만 필요합니다.

While-loop

지정된 표현식이 거짓으로 평가될 때까지 일련의 명령어를 반복적으로 실행합니다.

WinActivate

지정된 창을 활성화합니다 (전경 화면으로 만듭니다).

WinActivateBottom

WinActivate와 동일합니다. 단 최상단 창이 아니라 (가장 최근까지도 활성화되지 않은) 최하단 창을 활성화한다는 점이 다릅니다.

WinActive()

활성창이 지정된 기준에 부합하면 그 유일한 ID (HWND)를 돌려줍니다.

WinClose

지정된 창을 닫습니다.

WinExist()

제일 처음 부합한 창의 유일한 ID (HWND)를 돌려줍니다.

WinGetActiveStats

WinGetActiveTitle 기능과 WinGetPos기능을 하나의 명령어로 결합합니다.

WinGetActiveTitle

활성 창의 제목을 반환합니다.

WinGetClass

지정된 창의 클래스 이름을 반환합니다.

WinGet

지정된 창의 유일한 ID, 프로세스 ID, 프로세스 이름, 또는 그의 컨트롤 목록을 반환합니다. 또 지정된 기준에 부합하는 모든 창의 목록을 반환할 수도 있습니다.

WinGetPos

지정된 창의 크기와 위치를 반환합니다.

WinGetText

지정된 창으로부터 텍스트를 반환합니다.

WinGetTitle

지정된 창의 제목을 반환합니다.

WinHide

지정된 창을 감춥니다.

WinKill

지정된 창을 강제로 닫습니다.

WinMaximize

지정된 창을 최대 크기로 확대합니다.

WinMenuSelectItem

지정된 창의 메뉴 바에서 메뉴 항목을 요청합니다.

WinMinimize

지정된 창을 태스크 바의 버튼으로 축소합니다.

WinMinimizeAll

모든 창을 최소화합니다.

WinMinimizeAllUndo

이전 WinMinimizeAll의 효과를 언두합니다.

WinMove

지정된 창의 위치 / 크기를 변경합니다.

WinRestore

지정된 창이 최대화 또는 최소화 상태이면 원래대로 복구합니다.

WinSet

지정된 창에 다양한 변경을 가할 수 있습니다. 예를 들어 "항상 위에" 그리고 투명도.

WinSetTitle

지정된 창의 제목을 바꿉니다.

WinShow

지정된 창을 보여줍니다.

WinWait

지정된 창이 끝날 때까지 기다립니다.

WinWaitActive

지정된 창이 활성화될 때까지 기다립니다.

WinWaitClose

지정된 창이 존재하지 않을 때까지 기다립니다.

WinWaitNotActive

지정된 창이 활성화되지 않을 때까지 기다립니다.

#ClipboardTimeout

첫 시도가 실패할 때 클립보드에 얼마나 오랫 동안 접근을 시도할지 변경합니다.

#CommentFlag

스크립트의 주석 심볼을 쌍반점에서 다른 문자열로 바꿉니다.

#ErrorStdOut

스크립트의 기동을 방해하는 구문 에러를 대화상자에 보여주는 대신에 표준 출력(stdout)으로 보냅니다.

#EscapeChar

스크립트의 피신 문자를 바꿉니다 (예를 들어: 역사선 vs. 액센트).

#HotkeyInterval

#MaxHotkeysPerInterval과 함께, 핫키 활성화 비율을 지정합니다. 이를 넘어서면 경고 대화상자가 나타납니다.

#HotkeyModifierTimeout

핫키 수식자의 행위에 영향을 미칩니다: CTRL, ALT, WIN, 그리고 SHIFT.

#Hotstring

핫스트링 옵션이나 종료 문자를 바꿉니다.

#If

#IfWinActive와 비슷하지만, 어떤 표현식에도 작동합니다.

#IfTimeout

#If 표현식 한 줄을 평가하는 데 소비할 최대 시간을 설정합니다.

#IfWinActive / #IfWinExist

문맥-감지 핫키와 핫스트링을 생성합니다. 문맥 감지 핫키는 활성화되어 있는 창의 종류에 따라 또는 존재 여부에 따라 다른 행위를 수행합니다.

#Include

스크립트는 마치 지정된 파일의 내용이 지정한 위치에 정확하게 존재하는 듯 행동합니다.

#InputLevel

핫키와 핫스트링이 어느 인위적인 키보드와 마우스 이벤트를 무시할지 제어합니다.

#InstallKeybdHook

키보드 갈고리를 무조건 설치합니다.

#InstallMouseHook

마우스 갈고리를 무조건 설치합니다.

#KeyHistory

KeyHistory 창에 보여주는 키보드와 마우스 이벤트의 최대 개수를 설정합니다. 0으로 설정하면 키 이력을 보여주지 않습니다.

#LTrim

계속 섹션에서 들여쓰기를 다듬을지 여부를 설정합니다.

#MaxHotkeysPerInterval

#HotkeyInterval과 함께, 핫키의 활성화 비율을 설정합니다. 이 비율을 넘어서면 경고 대화상자가 나타납니다.

#MaxMem

각 변수의 최대 메모리를 지정된 개수의 메가바이트로 설정합니다.

#MaxThreads

동시 쓰레드의 최대 갯수를 설정합니다.

#MaxThreadsBuffer

#MaxThreadsPerHotkey 한계에 도달했을 때 키눌림을 무시하지 않고핫키가 버퍼 처리됩니다.

#MaxThreadsPerHotkey

핫키 또는 핫스트링당 동시 쓰레드의 최대 개수를 설정합니다.

#MenuMaskKey

Win 또는 Alt 키업 이벤를 마스크하는데 사용할 키를 변경합니다.

#NoEnv

환경 변수인지 알아보기 위해 빈 문자열을 점검하지 않습니다 (새로운 모든 스크립트에 권장합니다).

#NoTrayIcon

트레이 아이콘을 보여주지 않습니다.

#Persistent

스크립트를 영구히 실행되도록 유지합니다 (즉, 사용자가 닫을 때까지 또는 ExitApp를 만날 때까지).

#SingleInstance

스크립트가 이미 실행 중일 때 다시 실행하는 것을 허용할지 여부를 결정합니다.

#UseHook

갈고리를 사용해 키보드 핫키를 구현하도록 강제합니다.

#Warn

보통 개발자쪽 에러임을 나타내는 선택된 조건에 대하여 경고를 켜거나 끕니다.

#WinActivateForce

부드럽게 창을 활성화하지 않고 직접 강제로 활성화합니다.


#Hotstring

핫스트링 옵션이나 종료 문자를 변경합니다.

#Hotstring NoMouse

#Hotstring EndChars NewChars

#Hotstring NewOptions

매개변수

NoMouse

마우스 클릭 때문에 여기에 기술하는 바와 같이 핫스트링 인식자가 재설정되지 않도록 막습니다. 부작용으로서, 이것은 또 마우스 갈고리를 핫스링이 요구하지 못하도록 막습니다 (그렇지만 스크립트가 다른 목적으로 요구하면 여전히 설치될 것입니다. 예를 들어, 마우스 핫키). #Hotstring NoMouse이 스크립트에 존재하면 모든 핫스트링에 영향을 줍니다. 단순히 물리적으로 그 아래에만 영향을 미치는 것이 아닙니다.

EndChars NewChars

단어 EndChars 다음에 스페이스를 하나 두고 다음에 새 종료 문자를 지정하십시오. 예를 들어:

#Hotstring EndChars -()[]{}':;"/\,.?!`n `t

새 종료 문자는 전체 스크립트에 전역적으로 효과가 있으므로 -- EndChars 지시어가 어디에 나타나는가에 상관 없이 -- EndChars를 한 번 이상 지정할 필요가 없습니다.

종료 문자의 최대 개수는 100개입니다. 이 길이를 넘어서는 문자는 무시합니다.

탭을 종료 문자로 만들려면, 목록에 `t를 포함하십시오. 스페이스를 종료 문자로 만들려면, 목록에 두 개의 다른 문자 사이에 포함하면 됩니다 (또는 리스트에 오직 문자가 하나 밖에 없다면 또는 하나도 없다면, 처음에 포함시킵니다).

NewOptions

핫스트링 옵션 에 기술하는 바와 같이 새 옵션을 지정합니다. 예를 들어: #Hotstring r s k0 c0.

위의 EndChars와 다르게, #Hotstring 지시어는 이런 식으로 사용될 때 위치에 민감합니다. 다른 말로 하면, 핫스트링의 전체 섹션은 다음 예제와 같이 기본 옵션이 다를 수 있습니다:

::btw::by the way

#Hotstring r c ; 이 아래의 핫스트링은 모두 "날 전송 모드"를 사용하고 기본으로 대소문자를 구분합니다.

::al::airline

::CEO::Chief Executive Officer

#Hotstring c0 ; 이 지점 아래의 모든 핫스트링을 대소문자에 무감각하게 만듭니다.

관련 항목

Hotstrings


#ifWinActive/Exist

문맥-감지 핫키와 핫스트링을 만듭니다. 그런 핫키는 활성화 된 또는 존재하는 창의 종류에 따라 다른 조치를 수행합니다 (또는 아무일도 하지 않습니다).

#IfWinActive [, WinTitle, WinText]

#IfWinExist [, WinTitle, WinText]

#IfWinNotActive [, WinTitle, WinText]

#IfWinNotExist [, WinTitle, WinText]

#If [, Expression]

매개변수

WinTitle

목표 창을 식별하는 창 제목 또는 다른 기준. WinTitle 참조.

부합하는 행위는 자동-실행 섹션에 설정된 대로SetTitleMatchMode가 결정합니다.

대부분의 다른 지시어처럼, 변수는 지원하지 않습니다. ahk_pid와 ahk_id를 하드-코드된 프로세스나 창 ID와 함께 사용할 수는 있지만, 더 일반적인 것은 #IfWin이 간접적으로 GroupAdd나 Hotkey IfWin을 통하여 사용하는 것입니다.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (동봉된 Window Spy 유틸리티에 노출됨). 숨은 텍스트는 DetectHiddenText이 자동-실행 섹션 (스크립트이 최상단)에 켜져 있으면 탐지됩니다.

ExcludeTitle
ExcludeText

이것들은 지원되지 않지만, WinTitle대하여 ahk_group MyGroup를 지정하면 간접적으로 사용할 수 있습니다 (여기에서 MyGroup은 GroupAdd를 통하여 생성된 그룹이며, 이 그룹은 ExcludeTitle/Text를 지원합니다).

기본 연산

#IfWin 지시어로 문맥 감지 핫키와 핫스트링을 쉽게 만들 수 있습니다. 예를 들어:

#IfWinActive ahk_class Notepad

#space::MsgBox 노트패드 안에서 Win+Spacebar를 눌렀습니다.

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

문맥 감지를 끄려면, 매개변수 없이 #IfWin 지시어를 지정하십시오. 예를 들어:

#IfWinActive

#IfWin이 꺼져 있을 때 (또는 스크립트에 전혀 사용되지 않으며), 모든 핫키와 핫스트링이 모든 창에 대하여 활성화 됩니다 (Suspend나 Hotkey 명령어를 통하여 끌 수 있습니다).

마우스나 키보드 핫키가 #IfWin를 통하여 꺼져 있을 때, 고유의 기능을 수행합니다; 즉, 마치 그런 핫키가 전혀 없는 것처럼 활성 창에 건네집니다. 한 가지 예외가 있습니다: 조이스틱 핫키는: #IfWin이 작동하더라도, 다른 프로그램이 버튼 누름을 보는 것을 막지 않습니다.

#IfWin는 또 정상 키의 행위를 마치 엔터키나 스페이스 키처럼 바꾸는 데에도 사용할 수 있습니다. 이는 특정 창이 그 키를 무시하거나 마음에 안드는 행위를 수행할 경우 유용합니다. 예를 들어:

#IfWinActive Reminders ahk_class #32770 ; 아웃룩의 "알리미" 창.

Enter::Send !o ; "Enter" 키눌림은 선택된 알리미를 재우는게 아니라 열리도록 만듭니다.

#IfWinActive

변종 (중복) 핫키

특정 핫키나 핫스트링은 각 정의마다 #IfWin 기준이 다르다면 스크립트에 한 번 이상 정의할 수 있습니다. 이것을 핫키 변종이라고 합니다. 예를 들어:

#IfWinActive ahk_class Notepad

^!c::MsgBox 노트패드에서 Control+Alt+C를 눌렀습니다.

#IfWinActive ahk_class WordPadClass

^!c::MsgBox 워드패드에서 Control+Alt+C를 눌렀습니다.

#IfWinActive

^!c::MsgBox 노트패드/워드패드가 아닌 창에서 Control+Alt+C를 눌렀습니다.

여러 변종이 촉발될 수 있다면, 스크립트에서 제일 위쪽에 있는 변종만 촉발됩니다. 예외가 있다면 전역 변종입니다 (#IfWin 기준이 전혀 없다면): 언제나 가장 우선 순위가 낮습니다. 그러므로, 경쟁 상대로 다른 변종이 전혀 없을 경우에만 촉발됩니다 (이 예외는 핫스트링에 적용되지 않습니다).

중복 핫키를 만들 때, ^!+#와 같은 수식 심볼의 순서는 문제가 되지 않습니다. 예를 들어, ^!c는 !^c와 동일합니다. 그렇지만, 키는 일관성이 있게 철자가 되어야 합니다. 예를 들어, 이런 목적으로 Esc는 Escape와 같지 않습니다 (그렇지만 대소문자는 문제가 되지 않습니다). 또, 와일드카드 접두 심볼(*)이 있는 핫키는 완전히 비-와일드카드 핫키와 구분됩니다; 예를 들어, *F1와 F1는 각자 자신만의 변종 집합이 있습니다.

같은 핫키 서브루틴을 여러 변종이 실행하도록 만들려면, 가장 쉬운 방법은 동일한 핫키를 주욱 늘어놓고, 각각 #IfWin 지시어를 다르게 만드는 것입니다. 예를 들어:

#IfWinActive ahk_class Notepad

#z::

#IfWinActive ahk_class WordPadClass

#z::

MsgBox 노트패드 또는 워드패드에서 Win+Z를 눌렀습니다.

return

대안으로, #IfWinActive ahk_group MyGroup을 통하여 창 그룹을 사용할 수 있습니다.

핫키 변종을 (스크립트가 실행중인 동안에) 동적으로 생성하려면, "Hotkey IfWin"를 참조하십시오.

총평

#IfWin는 또 적절할 때 접두 키를 자신의 고유 기능으로 복구합니다 (접두 키는 "a & b"와 같이 핫키 안에 있는 "a" 키입니다). 주어진 접두 심볼에 대하여 활성화된 핫키가 전혀 없을 때마다 이런 일이 일어납니다.

Gosub나 Goto를 사용하여 핫키나 핫스트링 라벨에 점프할 때, 스크립트 상단에 가까운 변종으로 점프합니다.

핫키가 현재 #IfWin을 통하여 꺼져 있으면, 그의 키나 마우스 버튼은 "#" 문자와 함께 KeyHistory의 "Type" 컬럼에 나타납니다. 이는 스크립트 디버깅에 도움이 됩니다.

%Var%와 같은 변수 참조는 현재 지원하지 않습니다. 그러므로, 퍼센트 사인은 `%를 통하여 피신시켜야 합니다. 앞으로는 지원할 가능성이 있습니다. 비슷하게, (`,를 통하여) 글자 그대로의 쉼표도 피신시켜야 합니다. 추가 매개변수가 미래에 추가될 가능성이 있습니다. 이 한계를 우회할 필요가 있다면, GroupAdd와 ahk_group를 사용하십시오.

Hotkey 명령어 가 핫키에 할당한 라벨은 #IfWin에 직접적으로 영향을 받지는 않습니다. 대신에, #IfWin를 스크립트 상단에 가깝게 사용하면 Hotkey 명령어가 생성한 모든 핫키에 영향을 줍니다 (단 "Hotkey IfWin"가 사용되어 그것을 바꾸지 않았어야 합니다).

알트-탭 핫키 는 #IfWin에 영향을 받지 않습니다: 오히려 모든 창에 효과가 있습니다.

마지막 발견 창은 이 #IfWinActive/Exist이 설정합니다 (그렇지만 #IfWinNotActive/NotExist로는 설정되지 않습니다). 예를 들어:

#IfWinExist ahk_class Notepad

#n::WinActivate ; #IfWin 이 발견한 창을 활성화합니다.

#IfWin의 매개변수 중 하나에 선두 또는 후미의 스페이스/탭이 필요하면, 피신 연속열 `s와 `t를 사용할 수 있습니다.

수행성능의 이유로, #IfWin는 지정된 창의 존재나 활성화를 항상 관제하지는 않습니다. 대신에, 핫키나 핫스트링을 타자할 때만 부합하는 창이 있는지 점검합니다. 부합하는 창이 존재하지 않으면, 키눌림이나 마우스 클릭은 활성 창 안으로 그대로 통과시킵니다.

창 제목과 텍스트는 대소문자를 구분합니다. 숨은 창은 DetectHiddenWindows이 (스크립트 상단) 자동 실행 섹션에서 켜졌다면 탐지됩니다 .

관련 항목

#If 표현식, Hotkey 명령어, Hotkeys, Hotstrings, Suspend, IfWinActive, IfWinExist, SetTitleMatchMode, DetectHiddenWindows

예제

#IfWinActive ahk_class Notepad

^!a::MsgBox 노트패드가 활성화되어 있는 동안 Ctrl-Alt-A를 눌렀습니다. ; 이 핫키는 다른 창에 눌려봐야 아무 효과도 없습니다 (그대로 "통과 시킵니다").

#c::MsgBox 노트패드가 활성화되어 있는 동안 Win-C를 눌렀습니다.

::btw:노트패드에 있는 동안에만 :"btw"에 대하여 이 텍스트로 교체됩니다.

#IfWinActive

#c::MsgBox 노트패드가 아닌 창에서 Win-C를 눌렀습니다.


{...}(block)

한 쌍의 활괄호는 블록을 뜻합니다. 블록은 전형적으로 함수, Else, Loop, While-loop, 그리고 IF-명령어와 함께 사용됩니다.

{
0개 이상의 명령어 나열
}

논평

블록은 두 개 이상의 명령어들을 하나로 묶는 데 사용됩니다. 또 어느 IF에 ELSE가 속하는지 바꾸는 데에도 사용됩니다. 다음 예제와 같이 블록은 ELSE를 두 번째가 아니라 첫 번째 IF에 속하게 만듭니다:

if var1 = 1
{
    if var2 = abc
        sleep, 1
}
else
    return

블록은 아무데나 사용할 수 있지만, 현재는 오직 functions, Else, Loop, 또는 IF-유형의 명령어들 (예를 들어 IfEqual 또는 IfWinExist)과 사용될 때만 의미가 있습니다.

만약 IF, ELSE, Loop, While-회돌이, 또는 For-회돌이에 명령어가 하나 밖에 없다면, 그 명령어는 블록에 쌀 필요가 없습니다. 그렇지만, 스크립트의 가독성을 향상시키고 유지관리성을 용이하게 하기 위해 그래야 할 경우가 있습니다.

블록은 비어 있어도 됩니다 (명령어가 없음). 이 경우는 블록 자체를 제거하지 않고 블록의 내용을 주석 처리하고 싶을 때 유용합니다.

One True Brace (OTB, K&R 스타일): OTB 스타일을 선택적으로 다음과 같은 경우에 사용할 수 있습니다: if-서술문의 표현식, else 키워드, while-회돌이, For-회돌이, 보통 회돌이, 함수 정의, Try, Catch, 그리고 Finally. 이 스타일은 블록의 시작 활괄호를 블록의 제어 서술문과 같은 줄에 배치합니다. 그 줄 아래 따로 두지 않습니다. 예를 들어:

if (x < y) {
    ...
} else {
    ...
}
While x < y {
    ...
}
For k,v in obj {
    ...
}
Loop %RepeatCount% {
    ...
}
MyFunction(x, y) {
    ...
}
Try {
    ...
} Catch e {
    ...
} Finally {
    ....
}

비슷하게, 명령어 또는 기타 조치는 활괄호 우측에 존재합니다 (단, One True Brace 스타일의 여는 괄호는 제외합니다). 예를 들어:

if x = 1
{ MsgBox 이 줄은 여는 괄호의 오른쪽에 나타납니다. IF-서술문이 참일 때마다 실행됩니다.
    MsgBox 이 줄은 다음 줄입니다.
} MsgBox 이 줄은 닫는 괄호의 오른쪽에 나타납니다. 무조건 실행됩니다.

관련 항목

Functions, While-loop, Loop, Else, If, If(Expression)

예제

if x = 1
{
    MsgBox, test1
    Sleep, 5
}
else
    MsgBox, test2


ControlSend,ControlSendRaw

흉내낸 키눌림을 창이나 콘트롤에 보냅니다.

ControlSend [, Control, Keys, WinTitle, WinText, ExcludeTitle, ExcludeText]

ControlSendRaw: 위와 매개변수 동일.

매개변수

Control

ClassNN (콘트롤의 클래스이름과 실체 번호) 또는 콘트롤의 텍스트일 수 있습니다. 둘 모두 Window Spy를 통하여 알아낼 수 있습니다. 텍스트를 사용할 때, 부합 행위는 SetTitleMatchMode로 결정됩니다. 이 매개변수가 비어 있거나 생략되면, 목표 창의 최상위 콘트롤이 사용됩니다. 이 매개변수가 ahk_parent이면, 키눌림이 그의 콘트롤 중 하나가 아니라 곧바로 목표 창으로 전송됩니다 (예제는 Winamp 자동화하기를 참조하십시오).

콘트롤의 HWND (창 핸들)에 작동시키려면, Control 매개변수를 비워두고 ahk_id %ControlHwnd%를 WinTitle 매개변수에 지정하십시오 (이것은 숨은 콘트롤에도 작동합니다. DetectHiddenWindows가 꺼져 있어도 상관이 없습니다). 콘트롤의 HWND는 전형적으로 ControlGet Hwnd, MouseGetPos, 또는 DllCall을 통하여 열람합니다.

Keys

전송할 키 연속 (자세한 것은 Send 명령어 참조). 문자 그대로의 쉼표를 전송하려면, 피신시키십시오 (`,). 문자를 전송하는 비율은 SetKeyDelay로 결정됩니다.

Send 명령어와 다르게, 마우스 클릭은 ControlSend로 보낼 수 없습니다. 마우스 클릭을 보내려면 ControlClick을 사용하십시오.

WinTitle

목표 창을 식별하는 창 제목이나 기타 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (Window Spy에 노출). 숨은 텍스트는 DetectHiddenText가 켜져(ON) 있어야 탐지됩니다.

ExcludeTitle

제목에 이 값이 있는 창은 배제합니다.

ExcludeText

텍스트에 이 값이 있는 창은 배제합니다.

ErrorLevel

[v1.1.04+] 이 명어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel 은 문제가 있으면 1 없으면 0이 설정됩니다.

논평

ControlSendRaw는 Keys 매개변수에 있는 키눌림을 정확하게 나타나는 그대로 전송합니다. {Enter}를 ENTER 키눌림으로, ^c를 Control-C로, 등등 변환하지 않습니다.

Control 매개변수를 생략하면, 이 명령어는 목표 창에 직접 전송을 시도합니다. 그의 최상위 콘트롤에 전송하거나 (보통 올바른 창) 또는 콘트롤이 없으면 그 창 자체에 전송합니다. 창에 콘트롤이 전혀 없는 듯 보일 때, 또는 그냥 편하게 어느 콘트롤에 보내야 할지 고민하고 싶지 않을 때 유용합니다.

기본값으로, 수식 키 (Control, Alt, Shift, 그리고 Win)는 보통 Send 명령어로 전송되는 것과 똑 같이 전송됩니다. 이렇게 하면 명령어 프롬프트와 기타 콘솔 창이 대문자, 제어 문자 등등을 적절하게 탐지할 수 있습니다. 또 다른 면에서 신뢰성도 향상됩니다.

그렇지만, 어떤 경우 이 수식 이벤트는 활성 창과 얽힐 수 있습니다. 특히 ControlSend가 진행 중인 동안에 사용자가 격렬하게 타자하고 있다면 또는 Alt 키가 전송 중이라면 (Alt는 활성 창의 메뉴 바를 활성화 시키기 때문에) 간섭 현상이 일어날 수 있습니다. 이런 일은 다음 예제와 같은 명시적으로 수식 키를 누르고 떼는 이벤트를 전송하면 피할 수 있습니다:

ControlSend, Edit1, {Alt down}f{Alt up}, Untitled - Notepad

위의 방법은 또 워크스테이션이 잠겨 있는 동안 (로그온 프롬프트로 보호되어 있는 동안)에도 수식키 눌림 (Control/Alt/Shift/Win)을 전송할 수 있습니다.

BlockInput 는 명령어 프롬프트와 같은 콘솔 창에 ControlSend를 사용할 때 절대 피해야 합니다. 왜냐하면 Control과 같은 수식키와 대소문자 변환이 제대로 작동하지 못하기 때문입니다.

SetKeyDelay 의 값은 키가 전송되는 속도를 결정합니다. 목표 창이 키 눌림을 제대로 받지 않으면, 다음 예제와 같은 SetKeyDelay의 두 번째 매개변수를 통하여 누름 지속 시간을 늘려 보십시오:

SetKeyDelay, 10, 10

SetKeyDelay, 0, 10

SetKeyDelay, -1, 0

목표 콘트롤이 Edit 콘트롤이면 (또는 그 비슷한 콘트롤이면), ControlSend보다 다음이 보통 더 믿을 만하고 더 빠릅니다:

Control, EditPaste, 이 텍스트는 캐럿 위치에 삽입됩니다., ControlName, WinTitle

ControlSetText, ControlName, 이 텍스트는 현재 텍스트를 완전히 교체합니다., WinTitle

ControlSend는 일반적으로 창의 메뉴 바를 조작할 수 없습니다. 이를 우회하려면, WinMenuSelectItem을 사용하십시오. 메뉴 바의 특성 때문에 그 마저도 사용할 수 없으면, 원하는 메뉴 항목에 상응하는 메시지를 찾아보십시오. 다음 SendMessage 자습서를 따르시면 됩니다.

창 제목과 텍스트는 대소문자에 민감합니다. 숨은 창은 DetectHiddenWindows가 켜져 있어야 탐지됩니다.

관련 항목

SetKeyDelay, 피신 연속열 (예, `%), Control, ControlGet, ControlGetText, ControlMove, ControlGetPos, ControlClick, ControlSetText, ControlFocus, Send, Winamp 자동화하기

예제

ControlSend, Edit1, 이 줄은 노트패드 창에 있는 줄입니다., Untitled

SetTitleMatchMode, 2

ControlSend, , abc, cmd.exe ; 명령어 프롬프트 창에 직접 전송합니다.


ControlGetText


DllCall


If(traditional)


IfMsgBox


InputBox


MsgBox


Run/RunWait


Send,SendRaw,SendInput,SendPlay,SendEvent


SendMode


SetKeyDelay


정규식 표현 참조


AutoHotkey_L

AutoHotkey_L 새로운 특징


스크립트 호환성

AutoHotkey 1.0으로 작성된 스크립트는 대부분 AutoHotkey 1.1 위에서 아무 변경없이 실행됩니다. 그러나 몇 가지 기능은 두 버전 사이의 어쩔 수 없는 차이점 때문에 제대로 작동하지 않을 수 있습니다. 가장 문제가 되는 차이점은 DllCall 같은 고급 기능에만 영향을 미치기 때문에, 대부분의 사용자는 신경쓸 필요가 없습니다.

AutoHotkey 1.1은 "AutoHotkey_L"이라고도 알려져 있는데, 반면에 AutoHotkey 1.0은 역으로 "AutoHotkey Basic"이라는 라벨이 붙었습니다. AutoHotkey_L의 예전 버전 중에는 1.0.* 버전 번호를 사용합니다. 그래서 명확하게 하기 위해, 이 문서는 오토핫키의 두 분기를 버전 번호가 아니라 이름으로 지칭합니다.

주의: 가장 흔한 문제는 유니코드 텍스트를 지원하도록 변경한 것 때문인데, 이는 그냥 ANSI 버전의 AutoHotkey_L를 사용하면 피할 수 있습니다.

기본

큰 영향:

• 구문 에러를 더 이상 용납하지 않습니다

• FileRead가 부패한 이진 데이터를 돌려줄 수 있습니다

• 변수 이름과 함수 이름에 [, ] 또는 ?를 허용하지 않습니다

중간 영향:

• Transform Unicode 명령어는 유니코드 버전에서 사용할 수 없습니다

• AutoHotkey.ini 대신에 AutoHotkey.ahk가 기동합니다

• SetFormat, Integer, H는 대소문자를 구분합니다

• A_LastError는 더 많은 명령어에 의하여 변경됩니다

• MsgBox가 쉼표를 더 일관성이 있게 처리합니다

• Gui +Owner는 추가 스타일을 오버라이드합니다

• GUI에 DPI 스케일링이 기본적으로 켜집니다

• SoundSet과 SoundGet은 비스타 이후에 더 잘 작동합니다

• ~틸드는 맞춤 수식 키의 작동에 영향을 미칩니다

• x & y::는 x를 뗄 때 x::와 x up::을 모두 촉발시킵니다

작은 영향:

• var가 type이면 기본적으로 시스템 로케일을 무시합니다

• GroupActivate는 ErrorLevel을 설정하고 GroupAdd의 Label은 다르게 작동합니다

• Run과 RunWait는 Target을 다르게 이해합니다

• Control-Z는 파일끝으로 번역되지 않습니다

• 호환성 모드가 혼란을 야기할 수 있습니다

• A_IsCompiled는 언제나 읽기 전용입니다

• 선두와 후미의 `t 연속열은 더 이상 폐기되지 않습니다

고급

• Unicode vs ANSI

• VarSetCapacity

• DllCall

• NumPut / NumGet

• 포인터 크기

기본

구문 에러

AutoHotkey Basic에서 용인되었던 어떤 구문 에러는 이제 더 이상 AutoHotkey_L에서 용납하지 않습니다. 그런 에러는 대부분 식별하기만 하면 쉽게 교정할 수 있습니다. 다음 에러는 스크립트를 AutoHotkey_L에서 기동하자 마자 즉시 탐지됩니다. 교정해야 스크립트를 실행할 수 있습니다:

• 명령어와 매개변수 사이에 스페이스나 탭 또는 쉼표가 필요합니다. 예를 들어, MsgBox< foo 그리고 If!foo는 용납되지 않습니다.

• Hotkey, IfSomething에서 Something이 무효이며, 허용되지 않습니다.

다른 어떤 구문 에러는 스크립트가 실행 중일 때 탐지됩니다. 에러 메시지를 먼저 보여준 다음에 현재 쓰레드를 종료합니다:

• 흔한 에러: 인식할 수 없는 또는 형식이 나쁜 Gui, Gui Show 또는 GuiControl 옵션.

• 그룹 이름이 비어 있는 GroupAdd. 이전에는 쓰레드가 조용히 종료했습니다.

• Gui 옵션 +LastFoundExist는 다른 옵션과 조합하면 안 됩니다. 왜냐하면 그렇게 하면 +LastFound와 똑같이 행동하기 때문입니다.

어떤 구문 에러는 현재 탐지되지 않지만, AutoHotkey_L에 문제를 일으킵니다:

• (과의 자동-결합(Auto-concat)은 더 선별적이 되었습니다. 그래서 12(34)와 같이 무효한 표현식은 더 이상 작동하지 않습니다.

FileRead

FileRead는 보통의 경우 코드 페이지 사이에 텍스트를 변환합니다. 그러므로 부패한 이진 데이터를 출력할 가능성이 있습니다. 이를 피하려면 *c 옵션을 추가하거나 대신에 FileOpen을 사용하십시오.

변수 이름과 함수 이름

[, ] 그리고 ?는 표현식에 사용이 예약되어 있습니다. 그래서 더 이상 변수 이름으로 유효하지 않습니다. 결론적으로, ?는 (삼진 연산에 사용됨) 더 이상 양쪽에 스페이스가 없어도 됩니다. 객체 구문을 참조하십시오.

에러는 자동으로 탐지될 수도 있고 아닐 수도 있습니다:

• 스크립트가 이런 문자들을 표현식에서 변수 이름에 사용하면, 일반적으로 그 스크립트는 에러 메시지를 보여주지 않고 실행되지만, 문자를 변수의 이름의 일부가 아니라 연산자로 이해하기 때문에 잘못된 행위를 하게 됩니다.

• 이런 문자가 이중 참조(double-deref)에 사용되면 (Array%n%과 같이 n에 위의 문자중 하나가 담겨 있으면), 스크립트가 실행되다가, 이중-참조가 평가될 때 에러 메시지가 나타납니다.

• 이 문자들이 다른 문맥에 사용되면, 예를 들어 할당의 왼편이나 명령어의 입/출력 변수의 이름 또는 %percent% 사인에 사용되면, 에러 메시지가 나타나고 스크립트는 기동하지 못합니다.

Transform

Transform 하위-명령어 중 일부는 유니코드 버전의 AutoHotkey_L에서 변경되거나 사용할 수 없습니다:

• Transform, Unicode는 사용 불가능합니다. 유니코드 텍스트를 클립보드에 할당하려면, 보통처럼 할당하십시오. 다음 참조: StrPut/StrGet.

• Transform, HTML는 추가 특징을 지원합니다.

기본 스크립트

AutoHotkey_L가 스크립트를 지정하지 않고 기동하면, .ini 파일 대신에 .ahk 파일이 적재됩니다. 이 파일의 이름은 현재 실행파일의 파일이름에 따라 다릅니다. 더 자세한 것은 스크립트에 명령어 줄 매개변수를 건네기를 참조하십시오.

SetFormat, Integer[Fast], H

대문자 H가 사용되면, 십육진수 A-F도 대문자가 됩니다. AutoHotkey Basic은 언제나 소문자를 사용합니다. SetFormat을 참조하십시오.

A_LastError

다음 명령어는 이제 A_LastError를 설정해 디버깅을 돕습니다: FileAppend, FileRead, FileReadLine, FileDelete, FileCopy, FileMove, FileGetAttrib/Time/Size/Version, FileSetAttrib/Time, FileCreateDir, RegRead, RegWrite, RegDelete. 이 명령어를 사용하면 A_LastError의 이전 값이 덮어 씌여집니다.

MsgBox

MsgBox의 똑똑한 쉼표 처리가 다른 모든 명령어와 일관성이 있게 그리고 유연하게 개선되었습니댜. 대부분의 경우, MsgBox는 의도한 대로 잘 작동합니다. 어떤 경우는 스크립트가 예전의 기묘한 행위에 의존하는 경우 행위에 변화가 보일 수 있습니다. 예를 들면:

; 다음은 이제 표현식 (Options) 다음에 텍스트 (Title)로 번역됩니다.

; 여러 부-표현식을 가진 단일 표현식 (Text) 으로 번역되지 않습니다 :

MsgBox % x, y

; 반괄호를 추가하면 예전의 번역을 강제할 수 있습니다:

MsgBox % (x, y)

; 다음은 이제 텍스트 "0, Title" 대신에 빈 대화상자를 보여줍니다:

MsgBox 0, Title

; 다음은 AutoHotkey_L 그리고 AutoHotkey Basic에서 모두 예상대로 행위합니다:

MsgBox 0, Title, % "" ; 빈 대화상자를 보여줍니다.

MsgBox 0`, Title ; 텍스트 "0, Title"을 보여줍니다.

; 다음은 이제 텍스트 ", Title" 대신에 빈 대화상자를 보여줍니다:

MsgBox,, Title

Gui +Owner

+Owner 옵션을 Gui에 적용하면 WS_CHILD 스타일이 제거되고 WS_POPUP 스타일이 설정됩니다. 이 때문에 스타일을 설정한 다음에 +Owner를 사용하여 Gui의 부모 창을 설정한 스크립트는 깨질 수 있습니다.

DPI 스케일링

DPI 스케일링은 기본적으로 스크립트 GUI에 켜집니다. 이 때문에 DPI 설정이 96 (100%)이 아니면 스크립트에 영향을 미칩니다. 이를 끄려면, Gui -DPIScale를 사용하십시오.

Windows Vista 이후의 Sound 명령어

SoundSet, SoundGet, SoundSetWaveVolume 그리고 SoundGetWaveVolume Windows Vista 이후에 개선되었습니다. 전형적인 행위의 변화로:

• 스크립트가 그냥 스크립트 자체 대신에 전체 시스템에 영향을 미칩니다 (보통 이것이 의도하는 바입니다).

• 장치는 번호가 다르게 매겨집니다 - 각 출력이나 입력은 별도의 장치로 간주 됩니다.

~틸드와 맞춤 조합 핫키

v1.1.14 부터, 틸드 접두 심볼은 맞춤 조합에 수식 키로 사용될 때 키가 작동하는 방식에 영향을 미칩니다.

맞춤 조합키와 Down/Up 핫키

틸드 접두 심볼이 사용되는 경우를 제외하고, 키-다운과 키-업 핫키가 맞춤 수식 키로 정의되어 있다면, 키를 뗄 때 둘 모두 촉발 됩니다. 예를 들어, x & y::이면 x를 뗄 때 x::와 x up::가 모두 촉발 됩니다. 예전에는 x::가 촉발 되지 않았습니다.

If var is type

If var is type는 시스템 로케일을 무시합니다. 단, StringCaseSense, Locale이 사용되었다면 예외입니다.

창 그룹

GroupActivate는 활성화 할 창을 발견하지 못하면 ErrorLevel에 1을 설정합니다, 그렇지 않으면 0을 설정합니다. 이전에는 ErrorLevel을 변경하지 않고 그대로 두었습니다.

GroupAdd의 Label 매개변수는 창 그룹에 전체적으로 적용됩니다. 그룹 안의 특정 창 규격 하나에만 적용되지 않습니다. 이 변경에 관한 토론이 포럼에 있습니다. 그렇지만, 이 매개변수를 사용하는 것은 추천 하지 않습니다; 대신에 GroupActivate를 호출한 후에 ErrorLevel을 점검하십시오.

Run / RunWait

AutoHotkey_L은 Run과 RunWait 명령어가 목표(Target) 매개변수를 번역하는 방식이 약간 개선되었습니다. 이 때문에 아주 희귀한 경우이기는 하지만, 예전에는 작동하지 않던 것들이 작동하게 되어 AutoHotkey Basic에서 이미 잘 작동하는 스크립트에 영향을 미칠 수 있습니다. 새로운 행위는 다음과 같습니다:

• Target이 따옴표로 시작하면, 다음 따옴표까지 모든 것을 조치로 취급합니다. 전형적으로 실행 파일로 간주합니다.

• 그렇지 않으면 첫 번째 부문자열이 스페이스로 끝나거나 기존의 파일이거나 또는 .exe, .bat, .com, .cmd 또는 .hta로 끝나면 조치로 간주합니다. 이 때문에 .ahk, .vbs 또는 .lnk 같은 파일 유형은 매개변수를 받을 수 있습니다. 그러면서도 이전의 버전과 같이 절대 경로가 없어도 여전히 wordpad.exe와 같이 "알려진" 실행 파일을 기동할 수 있습니다.

Control-Z

Loop Read 그리고 FileReadLine는 더 이상 문자 Control-Z (0x1A)를 파일 끝 표식으로 이해하지 않습니다. Control-Z는 모두, 파일 맨 끝에 오더라도, 그대로 적재됩니다. FileRead는 이미 이 문자를 무시합니다. 그래서 이 문제에 영향을 받지 않습니다.

호환 모드

-------

스크립트를 실행하는 데 사용된 EXE 파일의 특성에 호환 모드가 Windows 95, 98/ME 또는 NT4로 설정되었다면, 그 스크립트는 올바르게 작동하지 못합니다. 왜냐하면 호환 모드 때문에 특정 버전의 Windows가 어플리케이션에 보고되지만, AutoHotkey_L은 이런 버전을 지원하지 않기 때문입니다. 예를 들어, 호환 모드를 Windows 95 or 98/ME에 설정하면 MsgBox %A_OSVersion%는 WIN_NT4라고 보고합니다.

A_IsCompiled

----------

A_IsCompiled는 스크립트가 컴파일되지 않았다면 빈 문자열로 정의됩니다. 이전에는 정의되지 않은 채 그대로 두었습니다. 그 때문에 스크립트가 컴파일되지 않았음에도 A_IsCompiled := 1와 같은 할당이 유효했었습니다. 이제는 모든 경우에 읽기 전용 내장 변수로 취급됩니다.

공백 문자 피신

-----------

`t와 ` 같은 피신 공백문자는 더 이상 각 인자의 앞 뒤에서 제거되지 않습니다. 예를 들어, StringReplace s, s, `t는 이제 유효하며 모든 탭 문자를 s로부터 제거합니다.

Unicode vs ANSI

------------

텍스트 값은 종종 문자열(string)이라고 부릅니다. 각 텍스트의 값이 문자열의 연속 또는 줄지어(string) 저장되어 있기 때문입니다. 각 문자의 숫치 문자 코드와 크기 (바이트 단위)는 어느 버전의 AutoHotkey를 사용하고 있는가에 달려 있습니다: Unicode 또는 ANSI. 이런 세부 사항은 다음과 같은 일을 하려는 스크립트에 전형적으로 중요합니다:

•DllCall을 통하여 문자열을 외부 함수에 전달할 때.

•PostMessage/SendMessage를 통하여 문자열을 전달 할 때.

•NumPut/NumGet를 통하여 문자열을 조작할 때.

•VarSetCapacity를 사용하여 특정 개수의 문자를 변수에 담을 수 있는지 확인할 때.

한 가지 형식만 염두에 두고 설계된 스크립트는 종종 엉뚱한 버전의 AutoHotkey로 실행할 때 문제에 봉착합니다. 예를 들면, 어떤 스크립트가 AutoHotkey Basic용으로 작성되었다면 ANSI 버전의 AutoHotkey_L에서는 잘 작동하지만 유니코드 버전에서는 실패합니다. 어느 버전을 사용하고 있는지 잘 모르겠다면, 다음 스크립트를 실행해 보십시오:

MsgBox % A_IsUnicode ? "Unicode" : "ANSI"

ANSI: 각 문자는 한 바이트 (8 비트)입니다. 127을 넘는 문자 코드는 시스템의 언어 설정에 따라 달라집니다.

Unicode: 각 문자는 두 바이트 (16 비트)입니다. 문자 코드는 UTF-16 형식으로 정의됩니다.

의미구조 주의: 기술적으로, 어떤 유니코드 문자는 두 개의 16-비트 코드 단위로 표현됩니다. 합쳐서 "대리 쌍(surrogate pair)"라고 부릅니다. 비슷하게, 어떤 ANSI 코드 페이지는 (보통 DBCS(Double Byte Character Sets)라고 부름) 두 바이트 문자를 담고 있습니다. 그렇지만, 실용적인 이유로, 이것들을 거의 언제나 두 개의 개별 단위로 취급합니다 (단순하게 하기 위해 그냥 "문자(characters)"라고 부릅니다).

VarSetCapacity

VarSetCapacity는 변수의 가용 능력을 바이트 단위로 설정합니다. 변수의 가용능력을 문자의 개수에 기반하여 설정하려면, 문자의 크기를 반드시 고려해야 합니다. 예를 들어:

VarSetCapacity(ansi_var, capacity_in_chars)

VarSetCapacity(unicode_var, capacity_in_chars * 2)

VarSetCapacity(native_var, capacity_in_chars * (A_IsUnicode ? 2 : 1))

VarSetCapacity(native_var, t_size(capacity_in_chars)) ; 아래 참조

다음은 VarSetCapacity의 두 가지 주요 사용법입니다:

1.예측한 개수의 문자를 보유하도록 변수를 확장합니다. 그리하여 점진적 결합을 통해 문자열을 구성할 때 수행성능을 개선할 수 있습니다. 예를 들어, VarSetCapacity(var, 1000)는 1000 바이트를 허용합니다. 이것은 유니코드 버전의 AutoHotkey_L에서는 500 문자에 불과합니다. 이렇게 하면 수행성능에 영향을 미칠 수 있지만, 스크립트는 여전히 올바르게 작동합니다.

2.변수 크기를 조정해 이진 구조체를 담습니다. 구조체에 직접적으로 텍스트가 담겨 있다면, 그 텍스트의 형식을 반드시 고려해야 합니다. 형식은 구조체에 따라 다릅니다 - 어떤 경우는 유니코드 버전의 AutoHotkey_L에서도 ANSI 텍스트가 사용됩니다. 변수가 너무 작으면, 스크립트는 충돌하거나 아니면 예상하지 못한 행위를 할 수 있습니다 (구조체를 어떻게 사용하는가에 따라).

DllCall

"Str" 유형이 사용될 때, 현재 빌드의 고유 유형의 문자열이라는 뜻입니다. 어떤 함수는 특정한 형태의 문자열을 요구하거나 돌려주기 때문에, 다음의 문자열 유형을 사용할 수 있습니다:

문자 크기

C / Win32 Types

인코딩

WStr 16-비트 wchar_t*, WCHAR*, LPWSTR, LPCWSTR UTF-16

AStr 8-비트 char*, CHAR*, LPSTR, LPCSTR ANSI (시스템 기본 ANSI 코드 페이지)

Str -- TCHAR*, LPTSTR, LPCTSTR 유니코드 빌드의 WStr 그리고 ANSI 빌드의 AStr과 동등.

"Str" 또는 현재 빌드에 대하여 그와 동등한 유형이 매개변수로 사용되면, 그 문자열 또는 변수의 주소가 함수에 건네집니다. 그렇지 않으면 대신에 문자열의 임시 사본이 원하는 포맷으로 생성되고 건네집니다. 일반적으로, "AStr" 그리고 "WStr"은 함수가 그 매개변수에 변수를 쓸 때 사용하면 안 됩니다.

주의: "AStr" 그리고 "WStr"은 매개변수에 대하여 그리고 그 함수의 반환 값에 대하여 똑 같이 유효합니다.

일반적으로, 스크립트가 문자열을 매개변수로 받는 함수를 DllCall를 통하여 호출하면, 다음 접근법 중 하나를 취해야 합니다:

1. 함수를 Unicode (W) 버전과 ANSI (A) 버전으로 모두 사용할 수 있으면, 현재 빌드에 대하여 적절한 버전을 호출합니다. 다음 예제에서, "DeleteFile"은 내부적으로 "DeleteFileA" 또는 "DeleteFileW"이라고 부릅니다. "DeleteFile" 자체는 실제로 존재하지 않으므로, DllCall은 자동으로 현재 빌드에 대하여 적절하게 "A" 또는 "W"를 시도합니다: DllCall("DeleteFile", "Ptr", &filename)

DllCall("DeleteFile", "Str", filename)

다음 예제에서, &filename은 문자열의 주소를 정확하게 있는 그대로 건넵니다. 그래서 함수는 문자열을 "Str" 유형과 같은 형식이라고 예상해야 합니다. AutoHotkey Basic에서 "UInt"를 "Ptr" 대신에 사용할 수 있습니다. 그러나 결과 코드는 64-비트와 호환되지 않습니다.

주의: 함수를 정확하게 지정된 대로 발견할 수 없으면, AutoHotkey_L은 어느 DLL이 지정되어 있는가에 상관 없이 "A" 또는 "W" 접두사를 덧붙입니다. 그렇지만, AutoHotkey Basic은 User32.dll, Kernel32.dll, ComCtl32.dll, 또는 Gdi32.dll에 있는 함수에 대해서만 "A" 접두사를 붙입니다.

2.함수가 오직 특정 유형이 문자열만 입력으로 받는다면, 그 스크립트는 적절한 문자열 유형을 사용할 수 있습니다: DllCall("DeleteFileA", "AStr", filename)

DllCall("DeleteFileW", "WStr", filename)

3. 함수가 (비-고유 형식으로) 문자열을 수정해야 한다면, 스크립트는 버퍼를 위에 기술한 대로 할당하고 그의 주소를 함수에 건네야 합니다. 매개변수가 입력을 받는다면, 스크립트는 또한 입력 문자열도 적절한 형식으로 변환해야 합니다; StrPut을 사용하면 변환할 수 있습니다.

NumPut / NumGet

NumPut이나 NumGet이 문자열에 사용될 때, 주어진 유형의 문자열에 대하여 오프셋과 유형이 정확해야 합니다. 다음을 지침으로 삼으십시오:

; 8-bit/ANSI strings: size_of_char=1 type_of_char="Char"

; 16-bit/UTF-16 strings: size_of_char=2 type_of_char="UShort"

nth_char := NumGet(var, (n-1)*size_of_char, type_of_char)

NumPut(nth_char, var, (n-1)*size_of_char, type_of_char)

var에 음수 형태의 문자열이 들어 있다면, 적절한 값은 A_IsUnicode에 기반하여 결정할 수 있습니다:

nth_char := NumGet(var, t_size(n-1), t_char())

NumPut(nth_char, var, t_size(n-1), t_char())

; 편리성과 명료성을 위해 함수를 정의합니다:

t_char() {

return A_IsUnicode ? "UShort" : "Char"

}

t_size(char_count=1) {

return A_IsUnicode ? char_count*2 : char_count

}

포인터 크기

포인터 크기는 32-비트 빌드에 대하여 4 바이트 (AutoHotkey Basic 포함) 64-비트 빌드에 대하여 8 바이트입니다. 구조체나 DllCall을 사용하는 스크립트는 두 플랫폼에서 모두 올바르게 작동하려면 이 사실을 고려할 필요가 있습니다. 영향을 받는 구체적인 영역은 다음과 같습니다:

•여러 포인터를 가진 구조체의 필드에 대한 오프셋 계산.

•여러 포인터를 가진 구조체의 크기 계산.

•DllCall, NumPut 또는 NumGet에 사용되는 유형 이름.

크기와 오프셋 계산은 A_PtrSize을 사용하십시오. DllCall, NumPut 그리고 NumGet에는 적절하게 Ptr 유형을 사용하십시오.

필드의 오프셋은 보통 그 앞에 있는 모든 필드의 전체 크기임을 기억하십시오. 또 핸들도 (HWND와 HBITMAP 같은 유형을 포함하여) 본질적으로 포인터-유형임을 명심하십시오.

/*

typedef struct _PROCESS_INFORMATION {

HANDLE hProcess; // Ptr

HANDLE hThread;

DWORD dwProcessId; // UInt (4 bytes)

DWORD dwThreadId;

} PROCESS_INFORMATION, *LPPROCESS_INFORMATION;

*/

VarSetCapacity(pi, A_PtrSize*2 + 8) ; Ptr + Ptr + UInt + UInt

DllCall("CreateProcess", <omitted for brevity>, "Ptr", &pi, <omitted>)

hProcess := NumGet(pi, 0) ; Defaults to "Ptr".

hThread := NumGet(pi, A_PtrSize) ;

dwProcessId := NumGet(pi, A_PtrSize*2, "UInt")

dwProcessId := NumGet(pi, A_PtrSize*2 + 4, "UInt")


Basic Usage and Syntax

핫키

목차

  • 소개와 간단한 예제
  • 핫키 접두 심볼 테이블 (수식자)
  • 문맥-감지 핫키
  • 맞춤 조합과 기타 특징
  • 마우스 휠 핫키
  • 핫키 팁 그리고 논평
  • Alt-Tab 핫키
  • 함수 핫키

소개와 간단한 예제

핫키는 종종 단축키라고 지칭됩니다. 쉽게 한 행위를 촉발시킬 수 있기 때문입니다 (예를 들어 프로그램이나 키보드 매크로를 기동합니다). 다음 예제에서, 핫키 Win+N은 노트패드를 기동하도록 구성됩니다. 파운드 사인[#]은 Windows 키를 나타냅니다. 이것은 수식키(modifier)로 알려져 있습니다:

#n::
Run Notepad
return

위의 마지막 줄에서 return 은 핫키를 끝내는 기능을 합니다. 그렇지만, 핫키가 오직 한 줄만 실행할 필요가 있다면, 이 줄은 겹-쌍점의 오른쪽에 나열할 수 있습니다. 다시 말해, return 문이 묵시적으로 있습니다:

#n::Run Notepad

핫키에 하나 이상의 수식자를 사용하려면, 그것들을 연속적으로 나열합니다 (순서는 문제가 안 됩니다). 다음 예제는 ^!s 를 사용하여 Control+Alt+S를 나타냅니다:

^!s::
Send Sincerely,{enter}John Smith  ; 이 줄은 키눌림을 활성 (가장 앞쪽) 창에 보냅니다.
return

다음 수식키 심볼을 사용하여 핫키를 정의할 수 있습니다:

심볼

설명

#

Win (윈도우즈 로고 키). v1.0.48.01+에서, 윈도우즈 비스타 이후에, 윈도우즈 키가 포함된 (예, #a) 핫키는 윈도우즈 키를 뗄 때까지 기다리다가 비로서 "L" 키눌림을 담고 있는 텍스트를 전송합니다. 이 덕분에 그런 핫키 안에서 Send를 사용하더라도 PC가 잠기지 않습니다. 이 행위는 SendPlay (필요하지 않으므로) 그리고 맹목 모드를 제외하고 모든 전송 모드에 적용됩니다.

!

Alt

^

Control

+

Shift

&

앰퍼센트를 두 개의 키 사이 또는 마우스 버튼에 사용하면 그들을 조합해 맞춤 핫키를 만들 수 있습니다. 자세한 것은 아래를 참조합니다.

<

한 쌍중에 왼쪽 키를 사용합니다. 예를 들어 <!a는 !a와 같습니다. 왼쪽 Alt 키만 행위를 촉발시킨다는 점만 다릅니다.

>

한 쌍중에 오른쪽 키를 사용합니다.

<^>!

AltGr (alternate graving). 키보드 레이아웃에 오른쪽-Alt 말고 AltGr 키가 있다면, 이 일련의 심볼은 보통 AltGr을 나타내는 데 사용할 수 있습니다. 예를 들어:

<^>!m::MsgBox AltGr+m을 눌렀습니다.
<^<!m::MsgBox LeftControl+LeftAlt+m을 눌렀습니다.

다른 방법으로, AltGr 자체를 핫키로 만들려면, 다음 핫키를 사용하십시오 (위에 보여준 것과 같은 핫키가 필요 없습니다):

LControl & RAlt::MsgBox AltGr 자체를 눌렀습니다

.

*

와일드카드: 추가 수식자가 눌려 있더라도 핫키를 촉발시킵니다. 이것은 종종 키나 버튼의 리맵핑과 함께 사용됩니다. 예를 들어:

*#c::Run Calc.exe  ; Win+C, Shift+Win+C, Ctrl+Win+C, 등등은 모두 이 핫키를 촉발시킵니다.
*ScrollLock::Run Notepad  ; ScrollLock을 누르면 이 핫키는 수식 키가 눌려 있더라도 촉발됩니다.

~

핫키가 촉발되면, 그 키의 고유 기능은 불능이 됩니다 (시스템에 보이지 않습니다). 아래의 두 예제에서 , 사용자가 마우스 버튼을 클릭하면 활성 창으로 전송됩니다:

~RButton::MsgBox 오른쪽 마우스 버튼을 클릭했습니다.
~RButton & C::MsgBox 오른쪽 마우스 버튼을 누를 채로 C를 눌렀습니다.

다른 접두 심볼과 다르게, 틸드 접두 심볼은 어떤 핫키의 변형에는 나타나는 것이 허용됩니다. 그렇지만, 꺼지지 않았거나 보류된 맞춤 조합 핫키의 접두 키에 틸드가 적용되면, 모든 키조합에 대하여 그 접두 키의 행위에 영향을 미칩니다.

알트-탭을 대체하는 특수한 핫키는 언제나 틸드 접두 심볼을 무시합니다.

[v1.1.14+]: 틸드 접두 심볼이 그 자신도 핫키로 사용되는 맞춤 수식 키에 적용되면 (접두 키), 그 핫키는 키를 뗄 때까지 기다리는 대신에 키가 눌릴 때 촉발됩니다. 예를 들어, 위의 ~RButton 핫키는 버튼이 눌리자 마자 촉발됩니다. v1.1.14 이전이라면 (틸드 접두 심볼이 없으므로), 버튼을 떼자마자 촉발되었습니다. 그러나 RButton & C 조합이 활성화되어 있지 않을 경우에만 촉발되었습니다.

틸드 접두 심볼이 맞춤 조합 핫키에만 적용되고 비-맞춤 핫키에는 적용되지 않으면, 그 핫키의 고유 기능이 여전히 막혀 있습니다. 예를 들어, 아래의 스크립트에서 AppsKey를 누르면 ToolTip을 보여주고 문맥 메뉴는 촉발시키지 않습니다:

AppsKey::ToolTip 창을 순회하려면 < 또는 >을 누릅니다.
AppsKey Up::ToolTip
~AppsKey & <::Send !+{Esc}
~AppsKey & >::Send !{Esc}

$

이것은 주로 스크립트가 Send 명령어를 사용하여, 핫키 자체를 구성하는 키들을 전송할 경우에만 필요합니다. 그렇지 않으면 핫키 자체가 촉발될 가능성이 있습니다. $ 접두 심볼은 강제로 키보드 갈고리가 이 핫키를 구현하는데 사용되도록 만듭니다. 그 부작용으로 Send 명령어는 그 핫키를 촉발시키지 못합니다. $ 접두 심볼은 이 핫키가 정의된 위쪽 어딘가에 #UseHook 을 지정하는 것과 동등합니다.

$ 접두 심볼은 마우스 핫키에는 아무 효과가 없습니다. 왜냐하면 마우스 핫키는 언제나 마우스 갈고리를 사용하기 때문입니다. 또 이미 키보드 갈고리를 요구하는 핫키에도 아무 효과가 없습니다. 여기에는 tilde (~) 또는 wildcard (*) 수식자를 가진 모든 핫키, 키-뗌 핫키와 맞춤 조합 핫키가 포함됩니다.

[v1.1.06+]: #InputLevel과 SendLevel를 사용하면 Send 명령어로 촉발될 핫키와 핫스트링을 제어할 수 있습니다.

UP

단어 UP이 핫키의 이름 다음에 오면 그 핫키는 누를 때가 아니라 뗄 때 촉발됩니다. 다음 예제는 LWin이 LControl이 되도록 리맵합니다:

*LWin::Send {LControl Down}
*LWin Up::Send {LControl Up}

"Up"은 다음 예제와 같이 보통의 핫키와 함께 사용할 수도 있습니다: ^!r Up::MsgBox Ctrl+Alt+R을 누르고 뗐습니다.. 또 핫키 조합과도 작동합니다 (예, F1 & e Up::)

한계: 1) "Up"은 조이스틱 버튼과 작동하지 않습니다; 그리고 2) 보통의/누름 짝이 없이 "Up" 핫키 하나만 사용하면 그 키를 완전히 점령합니다. 그 키는 누를 수 없습니다. 이를 피하는 한 가지 방법은 틸드 접두 심볼을 추가하는 것입니다 (예, ~LControl up::)

관련해서 한 마디 하자면, 위와 비슷한 테크닉은 핫키를 접두 키로 만드는 것입니다. 핫키를 뗄 때 촉발되지만, 다른 키를 누르지 않는 한, 누르고 있는 동안에만 촉발된다는 장점이 있습니다. 예를 들어:

LControl & F1::return  ; 왼쪽 콘트롤 키를 접두 키로 만듭니다.  "&" 앞에 한 번만 사용하면 됩니다.
LControl::MsgBox 다른 키를 수정하는 데 사용하지 않고 LControl를 뗐습니다.

(키보드 키와 마우스/조이스틱 버튼의 완전한 목록은 키 목록을 참조하십시오)

다중 핫키를 수직으로 쌓으면 같은 행위를 수행하게 할수 있습니다. 예를 들어:

^Numpad0::
^Numpad1::
MsgBox Control+Numpad0이나 Control+Numpad1를 누르면 이 메시지가 화면에 보입니다.
return

키 또는 키-조합을 전체 시스템에 대하여 불능화할 수 있습니다. 아무것도 하지 않도록 만들면 됩니다. 다음 예제는 오른쪽 윈도우즈 키를 불능으로 만듭니다:

RWin::return

문맥-감지 핫키

#IfWinActive/Exist와 #If 지시어를 사용하면 특정 조건에 따라 핫키가 다른 행위를 수행하게 (또는 전혀 못하게) 만들 수 있습니다. 예를 들어:

#IfWinActive, ahk_class Notepad
^a::MsgBox 노트패드가 활성상태인 동안 Ctrl-A를 눌렀습니다. 다른 창에 Ctrl-A를 누르면 Ctrl-A 키눌림이 그 창으로 전송됩니다.
#c::MsgBox 노트패드가 활성상태인 동안 Win-C를 눌렀습니다.

#IfWinActive
#c::MsgBox 노트패드가 아닌 다른 창이 활성 상태인 동안 Win-C를 눌렀습니다.

#If MouseIsOver("ahk_class Shell_TrayWnd")
WheelUp::Send {Volume_Up}     ; 태스크바 위에서 휠을 돌립니다: 볼륨을 높이거나/내립니다.
WheelDown::Send {Volume_Down} ;

맞춤 조합과 기타 특징

두 키 사이에 " & "을 사용하여 맞춤 조합을 정의할 수 있습니다 (조이스틱 버튼 제외). 아래의 예에서, Numpad0를 누른 채로 두 번째 키를 누르면 핫키가 촉발됩니다:

Numpad0 & Numpad1::MsgBox Numpad0를 누른 채로 Numpad1을 눌렀습니다.
Numpad0 & Numpad2::Run Notepad

위의 예제에서 Numpad0는 접두 키가 됩니다; 그러나 또 이 때문에 자체만 눌리면 그의 원래/고유 기능을 잃어버립니다. 이를 피하기 위해, 스크립트는 Numpad0가 새 행위를 수행하도록 구성할 수 있습니다. 예를 들어 다음과 같이:

Numpad0::WinMaximize A   ; 활성/전경 창을 최대화합니다.
Numpad0::Send {Numpad0}  ; Numpad0를 떼면 Numpad0 키눌림을 생산하도록 만듭니다. 아래의 주석을 참조하십시오.

위의 맞춤 핫키가 하나라도 존재하면 Numpad0을 뗄 때 지시한 행위가 수행됩니다. 그러나 오직 Numpad0가 눌려 있는 동안 다른 키를 누르지 않을 경우에만 그렇습니다. v1.1.14+에서, 이 행위를 피할 수 있습니다. 틸드 접두 심볼을 두 핫키중 하나에 적용하면 됩니다.

Numlock, Capslock, 그리고 Scrolllock: 이런 키들은 강제로 언제나 켜거나("AlwaysOn") 언제나 끌("AlwaysOff")수 있습니다. 예를 들어: SetNumlockState AlwaysOn.

익스플로러의 핫키 오버라이딩하기: Win-E (#e) 그리고 Win-R (#r) 같은 윈도우즈 내장 핫키는 개별적으로 오버라이드할 수 있습니다. 그냥 스크립트에서 거기에 행위를 할당하기만 하면 됩니다. 자세한 것은 오버라이드 페이지를 참조하십시오.

Alt-Tab 대안: 핫키는 알트-탭 대신에 다른 수단을 제공할 수 있습니다. 예를 들어, 다음의 두 핫키로 오른 손으로 알트-탭을 수행할 수 있습니다:

RControl & RShift::AltTab  ; 오른쪽 콘트롤 키를 누른 채로 오른쪽-쉬프트를 반복적으로 눌러 앞으로 이동합니다.
RControl & Enter::ShiftAltTab  ; 오른쪽 콘트롤 키를 뗄 필요도 없이, 엔터를 눌러 반대방향으로 이동합니다.

더 자세한 것은 Alt-Tab을 참조하십시오.

마우스 휠 핫키

마우스 휠을 돌릴 때 촉발되는 핫키는 WheelDown과 WheelUp이라는 키 이름을 통하여 지원합니다. WheelLeft와 WheelRight도 역시 v1.0.48+에서 지원하지만, 윈도우즈 비스타 보다 오래된 버전에서는 아무 효과가 없습니다. 다음은 마우스 휠 핫키의 몇 가지 예입니다:

MButton & WheelDown::MsgBox 가운데 버튼을 누르고 있는 동안 마우스 휠을 돌렸습니다.
^!WheelUp::MsgBox Control+Alt를 누르고 있는 동안 휠을 위로 돌렸습니다.

v1.0.43.03+에서, 내장 변수 A_EventInfo에는 휠을 회전한 양이 담깁니다. 전형적으로 1이지만, A_EventInfo는 다음과 같은 상황에서 1 보다 더 클 수 있습니다:

  • 마우스 하드웨어가 1 눈금보다 더 적게 거리를 보고할 경우, A_EventInfo에는 0이 담깁니다;
  • 휠을 빠르게 돌릴 경우 (마우스의 종류에 따라), A_EventInfo는 1보다 큰 값이 담깁니다. 다음과 같은 핫키가 마우스를 분석하는데 도움이 될 수 있습니다: ~WheelDown::ToolTip %A_EventInfo%.

마우스 휠에 아주 유용한 핫키로 창의 텍스트를 스크롤하는 대안 모드와 관련되어 있습니다. 예를 들어, 왼쪽 콘트롤 키를 누른 채 휠을 돌릴 때 다음 핫키 쌍은 세로가 아니라 가로로 스크롤 합니다:

~LControl & WheelUp::  ; 왼쪽으로 스크롤 합니다.
ControlGetFocus, fcontrol, A
Loop 2  ; <-- 이 값을 증가시키면 더 빨리 스크롤됩니다.
    SendMessage, 0x114, 0, 0, %fcontrol%, A  ; 0x114은 WM_HSCROLL이고 그 다음에 0은 SB_LINELEFT입니다.
return

~LControl & WheelDown::  ; 오른쪽으로 스크롤합니다.
ControlGetFocus, fcontrol, A
Loop 2  ; <-- 이 값을 증가시키면 더 빨리 스크롤됩니다.
    SendMessage, 0x114, 1, 0, %fcontrol%, A  ; 0x114은 WM_HSCROLL이고 그 다음에 1이면 SB_LINERIGHT입니다.
return

마지막으로, 마우스 휠 핫키는 오직 누름-이벤트만 발생시키므로 (뗌-이벤트 없음), 키-뗌 핫키로 사용할 수 없습니다.

핫키 팁 그리고 논평

각 넘패드 키마다 Numlock의 상태에 따라 두개의 다른 핫키 서브루틴을 기동시킬 수 있습니다. 대안적으로, 넘패드 키는 같은 서브루틴을 Numlock의 상태에 상관없이 기동시킬 수 있습니다. 예를 들어:

NumpadEnd::
Numpad1::
MsgBox, 이 핫키는 Numlock의 상태와 관계없이 기동됩니다.
return

틸드 (~) 연산자가 접두 키와 함께 한 번이라도 사용되면, 모든 조합에 대하여 그 접두 키의 행위가 바뀝니다. 예를 들어, 아래의 두 핫키 모두, 두 정의 중에 하나만 틸드가 포함되어 있음에도 불구하고 활성 창은 모두 오른쪽 클릭을 받습니다:

~RButton & LButton::MsgBox 우버튼을 누르고 있는 동안 왼버튼을 눌렀습니다.
RButton & WheelUp::MsgBox 우버튼을 누르고 있는 동안 휠을 위로 돌렸습니다.

Suspend 명령어는 임시로 모든 핫키를 불능화할 수 있습니다. 단, 여러분이 직접 면제한 핫키는 예외입니다. 더 선택의 범위를 넓히려면, #IfWinActive/Exist를 사용하십시오.

Hotkey 명령어를 수단으로 하여, 스크립트가 실행중인 동안 핫키를 동적으로 생성할 수 있습니다. Hotkey 명령어는 또 스크립트에 이미 존재하는 핫키들을 개별적으로 수정하거나 불능으로 만들거나 활성화할 수 있습니다..

조이스틱 핫키는 현재 ^ (Control)과 # (Win) 같은 수식 접두 심볼을 지원하지 않습니다. 그렇지만, GetKeyState를 사용하면 다음 예제에 보여주는 바와 같이 그 효과를 흉내낼 수 있습니다:

Joy2::
if not GetKeyState("Control")  ; 왼쪽 콘트롤키 오른쪽 콘트롤 키 눌 다 눌려 있지 않습니다.
    return  ; 즉, 아무것도 하지 않습니다.
MsgBox 콘트롤 키를 누르고 있는 동안 첫 번째 조이스틱의 두 번째 버튼을 눌렀습니다.
return

핫키가 계속 진행하기 위해 자신의 수식 키가 떼어지기를 기다려야할 경우가 있습니다. 다음 예제를 살펴 보겠습니다:

^!s::Send {Delete}

Control-Alt-S를 누르면 시스템이 마치 Control-Alt-Delete를 누른 것처럼 행동합니다 (시스템이 Ctrl-Alt-Delete를 공격적으로 탐지하기 때문입니다). 이를 돌아가려면 KeyWait를 사용하여 키를 떼기를 기다립니다; 예를 들어:

^!s::
KeyWait Control
KeyWait Alt
Send {Delete}
return

#z::와 같은 핫키 라벨이 "Invalid Hotkey"와 같은 에러를 야기하는 경우, 시스템의 키보드 레이아웃/언어에 지정된 문자가 있을 수 있습니다 (이 경우는 "Z"). 키보드 레이아웃에 존재하지 않는 다른 문자를 사용하십시오.

핫키 라벨을 Gosub이나 Goto의 목표로 삼을 수 있습니다. 예를 들어: Gosub ^!s.

핫키의 흔한 사용 사례 하나는 예를 들어 일련의 키눌림이나 마우스 클릭 같이 반복 행위를 시작하고 멈추는 것입니다. 이를 보여주는 예는 다음 FAQ 주제를 참조하십시오.

마지막으로, 각 스크립트는 멀티-쓰레드와 비슷합니다. 덕분에 이전의 핫키 서브루틴이 여전히 실행중이더라도 새 핫키를 기동시킬 수 있습니다. 예를 들어, 현재 핫키에 의하여 MsgBox가 화면에 보여지고 있더라도 새 핫키를 기동시킬 수 있습니다.

Alt-Tab 핫키

각 Alt-Tab 핫키는 반드시 두 개의 키 조합이어야 합니다. 전형적으로 앰퍼센드(&) 심볼을 통하여 조합합니다. 다음 예제에서 오른쪽 Alt 키를 누른 채로 J 또는 K를 눌러 알트-탭 메뉴를 항해합니다:

RAlt & j::AltTab
RAlt & k::ShiftAltTab

AltTab 과 ShiftAltTab은 두 개의 특수한 명령어입니다. 같은 줄에 핫키로 사용될 때만 인지됩니다. 다음은 완전한 목록입니다:

AltTab: 알트-탭 메뉴가 보이면, 그 안에서 앞으로 이동합니다. 그렇지 않으면, 메뉴를 보여줍니다 (핫키가 두개의 키가 "&"로 조합되었을 경우에만 보여주고; 그렇지 않으면, 아무것도 하지 않습니다).

ShiftAltTab: 위와 같지만 메뉴에서 역방향으로 이동합니다.

AltTabAndMenu: 알트-탭 메뉴가 보이면, 메뉴 안에서 앞으로 이동하고, 그렇지 않으면 메뉴를 화면에 보여줍니다.

AltTabMenuDismiss: 알트-탭 메뉴를 닫습니다.

위의 예를 시연하기 위하여, 마우스 휠이 알트-탭을 완전해 대체하도록 만들 수 있습니다. 다음 핫키가 효과를 발휘하면, 가운데 버튼을 클릭해 메뉴를 보여주고 휠을 돌려서 그 안을 항해합니다:

MButton::AltTabMenu
WheelDown::AltTab
WheelUp::ShiftAltTab

선택된 창을 활성화할 필요 없이 핫키가-요청한 알트-탭 메뉴를 취소하려면, 다음과 같은 핫키를 사용합니다. 다음 조건에 따라 약간 조정이 필요할 수 있습니다: 1) 알트-탭 메뉴가 처음에 어떤 수단으로 화면에 보이게 ?는지; 그리고 2) 스크립트에 키보드 갈고리가 설치되어 있는지 여부.

LCtrl & CapsLock::AltTab
!MButton::  ; 가운데 마우스 버튼. ! 접두 심볼 때문에 Alt 키가 눌려 있는 동안 촉발됩니다 (알트-탭 메뉴가 보이면 촉발됩니다).
IfWinExist ahk_class #32771  ; 알트-탭 메뉴가 화면에 보인다는 사실을 알려줍니다.
    Send !{Escape}{Alt up}
return

현재, 모든 특수 알트-탭 행위는 위의 예제와 같이 직접적으로 핫키에 할당해야 합니다 (즉, 명령어처럼 사용할 수 없습니다). #IfWin 또는 #If에 영향을 받지 않기 때문입니다.

맞춤 알트-탭 행위는 핫키를 통해서도 만들 수 있습니다. 다음 예제에서, F1을 누르면 메뉴를 화면에 보여주고 그 안에서 앞으로 이동합니다. 다음 F2를 누르면 선택된 창을 활성화합니다 (또는 Escape를 누르면 취소됩니다):

*F1::Send {Alt down}{tab} ; 이 경우 별표가 필요합니다.
!F2::Send {Alt up}  ; Alt 키를 뗍니다. 그러면 선택된 창이 활성화됩니다.
~*Escape::
IfWinExist ahk_class #32771
    Send {Escape}{Alt up}  ; 선택된 창을 활성화하지 않고 메뉴를 취소합니다.
return

함수 핫키 [v1.1.20+]

하나 이상의 핫키를 함수에 할당할 수 있습니다. 다음 예제와 같이 그냥 핫키 라벨 바로 뒤에 정의하면 됩니다:

; Ctrl+Shift+O는 현재 폴더를 탐색기에 엽니다.
; Ctrl+Shift+E는 현재 파일이 선택된 폴더를 엽니다.
; SciTE와 Notepad++를 지원합니다.
^+o::
^+e::
    editor_open_folder() {
        WinGetTitle, path, A
        if RegExMatch(path, "\*?\K(.*)\\[^\\]+(?= [-*] )", path)
            if (FileExist(path) && A_ThisHotkey = "^+e")
                Run explorer.exe /select`,"%path%"
            else
                Run explorer.exe "%path1%"
    }

핫키 라벨이나 라벨 그리고 그 함수 사이에는 공백문자, 주석 또는 지시어만 있어야 합니다. 이런 식으로 정의된 핫키에 라벨은 생성되지 않습니다; 그렇지만, 자동-실행 섹션은 함수에 할당되어 있더라도 첫 번째 핫키에서 끝납니다.

함수를 사용하면 얻는 큰 혜택은 지역 변수를 사용할 수 있다는 것입니다. 다른 목적으로 같은 변수를 두 개 이상의 핫키에서 사용할 때 충돌을 피할 수 있습니다. 또한 자체-문서화 핫키를 권장합니다. 위의 코드에서 함수 이름 자체가 핫키를 설명하고 있습니다.

핫키 명령어를 사용해도 함수나 함수 객체를 핫키에 할당할 수 있습니다.


핫스트링과 자동-바꾸기

소개와 간단한 예제

핫스트링은 주로 타자하는 동안 약어를 확대하는 데 사용되지만 (자동-교체), 스크립트 행위를 기동시키는 데에도 사용할 수 있습니다. 이런 관점에서 핫키와 비슷합니다. 전형적으로 하나 이상의 문자로 (즉, 문자열로) 구성된다는 점이 다를 뿐입니다.

핫스트링을 정의하려면, 다음 예제와 같이 촉발 약어를 한 쌍의 쌍점으로 두릅니다:

::btw::by the way

위의 예제에서, 약어 btw는 타자되는 동안 자동으로 "by the way"로 교체됩니다 (그렇지만, 기본적으로 btw를 타자한 후에 스페이스, 마침표, 또는 엔터 같은 종료 문자를 타자해야 합니다).

위의 "by the way" 예제는 자동-교체 핫스트링이라고 합니다. 왜냐하면 타자된 텍스트가 자동으로 지워지고 두 번째 쌍점 쌍 뒤에 지정된 문자열로 교체되기 때문입니다. 대조적으로, 핫스트링은 다음 예제와 같이 맞춤 행위를 수행하도록 정의할 수도 있습니다. 명령어가 반드시 핫스트링 아래에 나타나야 함에 유의하십시오:

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

:*:]d::  ; 이 핫스트링은 아래의 명령어를 통하여 "]d"를 현재 날짜와 시간으로 교체합니다.
FormatTime, CurrentDateTime,, M/d/yyyy h:mm tt  ; 대략 다음과 같이 보일 것입니다: 9/1/2005 3:53 PM
SendInput %CurrentDateTime%
return

위의 두 예제가 자동-교체 핫스트링이 아님에도 불구하고, 여러분이 타자한 약어는 기본으로 지워집니다. 자동으로 백스페이스로 지우는 것인데, 이 행위는 b0 옵션으로 끌 수 있습니다.

종료 문자

별표 옵션이 효과를 발휘하지 않는 한, 핫스트링의 약어 뒤에 종료 문자를 타자해야 행위를 촉발시킬 수 있습니다. 종료 문자는 처음에 다음으로 구성됩니다: -()[]{}':;"/\,.?!`n `t ( `n은 엔터이고, `t는 탭, 그리고 `n과 `t 사이에 평범한 스페이스가 있음에 주목하십시오). 이 문자 세트는 다음 예제와 같이 편집해 바꿀 수 있습니다. 이렇게 하면 모든 핫스트링에 대하여 새로운 종료 문자가 설정됩니다. 그 아래에 있는 핫트링에만 영향을 미치는 것이 아닙니다:

#Hotstring EndChars -()[]{}:;'"/\,.?!`n `t

옵션

핫스트링의 기본 행위는 두 가지 방법으로 바꿀 수 있습니다:

  1. #Hotstring 지시어로 바꿀 수 있습니다. 이 지시어 아래쪽에 있는 모든 핫스트링에 물리적으로 영향을 미칩니다. 다음 예제는 C와 R 옵션 효과를 줍니다: #Hotstring c r.
  2. 핫스트링의 첫 번째 쌍점 쌍 사이에 옵션을 배치하는 방법이 있습니다. 다음 예제는 핫스트링 하나에만 C와 * 옵션이 효과가 있습니다:
    :c*:j@::john@somedomain.com ; 대소문자를 구분합니다. 그리고 "종료 문자가 필요하지 않습니다"..

아래의 리스트는 각 옵션을 기술합니다. 위의 방법을 사용하는 하나 이상의 옵션을 지정하면, 스페이스를 선택적으로 그 사이에 포함할 수 있습니다.

* (별표): 핫스트링을 촉발시키는 데 종료 문자 (예, 스페이스, 마침표, 또는 엔터)는 필요하지 않습니다. 예를 들어:

:*:j@::jsmith@somedomain.com

위의 예제는 @ 문자를 타자하는 순간 그의 교체 문자열을 전송합니다. #Hotstring 지시어를 사용할 때, *0을 사용하면 이 옵션을 끌 수 있습니다.

? (물음표): 핫스트링이 다른 단어 안에 있어도 촉발됩니다; 즉, 바로 앞에 타자된 문자가 알파벳이나 숫자일 때 촉발됩니다. 예를 들어, :?:al::airline 이 핫스트링이라면, "practical "을 타자하면 "practicairline "으로 교체됩니다. ?0을 사용하면 이 옵션을 끌 수 있습니다.

B0 (B 다음에 0): 여러분이 타자한 약어를 지우기 위해 자동 백스페이스 지우기가 일어나지 않습니다. 그냥 B만 사용하면 백스페이싱이 바로 이전에 꺼진 곳 다음부터 켜집니다. 스크립트도 스스로 백스페이싱을 할 수 있습니다. {bs 5}와 같이 하면 5 개의 백스페이스를 전송합니다. 비슷하게, 왼쪽-화살표 키는 {left 5}와 같이 전송합니다. 예를 들어, 다음 핫스트링은 "<em></em>"을 생산하고 캐럿을 5 자리 왼쪽으로 이동시킵니다 (그래서 태그 사이에 있게 됩니다):

:*b0:<em>::</em>{left 5}

C: 대소문자를 구분합니다: 약어를 타자할 때, 스크립트에 정의된 대소문자에 정확하게 일치해야 합니다. C0을 사용하면 대소문자 구분을 끕니다.

C1: 타자된 대소문자를 따르지 않습니다. 이 옵션을 사용하면 자동-교체 핫스트링을 대소문자를 구분하도록 만들 수 있고 실제로 타자한 문자의 대소문자 규격을 따르지 않도록 만들 수 있습니다. 대소문자 규격을 준수하는 핫스트링은 (이것이 기본값) 여러분이 약어를 모두 대문자로 타자했다면 교체 텍스트도 역시 모두 대문자로 생산합니다. 첫 번째 문자만 대문자로 타자했다면, 교체의 첫 문자도 역시 대문자가 됩니다. 다른 방식으로 대소문자를 타자하면, 교체 문자열 역시 정확하게 정의된 대로 전송됩니다. #Hotstring 지시어를 사용할 때, C0을 사용하면 이 옵션을 끌 수 있습니다. 핫스트링이 다시 대소문자를 준수하도록 만듭니다.

Kn: 키-지연 시간: 이 옵션은 자주 사용되지 않습니다. 자동-백스페이싱이나 자동-교체에 의하여 생산된 키눌림 사이에 지연 시간을 설정합니다. 새 지연 시간을 n에 지정합니다; 예를 들어, k10으로 지정하면 10ms 지연되고 k-1이면 지연이 없습니다. 이 옵션의 정확한 행위는 어떤 전송 모드가 작동 중인가에 따라 달라집니다:

  • SI (SendInput): 이 모드에서는 지연이 불가능하기 때문에 키-지연이 무시됩니다. 예외는 SendInput을 사용할 수 없을 때인데, 이 경우 핫스트링은 (키-지연을 준수하는) 아래의 SendPlay 모드로 돌아갑니다.

  • SP (SendPlay): 지연 길이 0이 기본값입니다. 이 값은 SendPlay에서는 -1과 같습니다 (지연 없음). 이 모드에서, 지연은 실제로 키눌림 사이의 지연이 아니라 PressDuration입니다.

  • SE (SendEvent): 지연 길이 0이 기본값입니다. 대부분의 목적에 0을 권장합니다. (내부적으로 Sleep 0을 수행하기 때문에) 빠르면서도 여전히 다른 프로세스와 잘 협력합니다. k-1을 지정하면 전혀 지연이 없습니다. CPU가 자주 쉰다면 자동 교체를 더 빠르게 만드는 데 유용합니다. -1로 설정할 때, 스크립트의 프로세스-우선순위는 얼마나 빠르게 키눌림을 전송할 수 있는가에 중요한 요소가 됩니다. 스크립트의 우선순위를 높이려면, Process, Priority,, High 를 사용하십시오.

O: 자동 교체가 생산될 때 자동-교체 핫스트링의 종료 문자를 생략합니다. 이것은 여전히 종료 문자를 요구함으로써 핫스트링을 명료하게 유지하기를 원하지만, 실제로는 종료 문자가 화면에 나타나지 않기를 바랄 때 유용합니다. 예를 들어, :o:ar::aristocrat 이 핫스트링이라면, "ar"를 타자한 다음 스페이스바를 타자하면 뒤에 스페이스 없이 "aristocrat"으로 교체됩니다. 이렇게 하면 백스페이스를 누를 필요 없이 단어를 복수형이나 소유형으로 만들 수 있습니다. O0 (문자 O 다음에 숫자 0)을 사용하면 이 옵션을 끌 수 있습니다.

Pn: 핫스트링의 우선순위 (예, P1). 자주 사용되지 않는 이 옵션은 자동-교체 핫스트링에 아무 효과가 없습니다.

R: 교체 텍스트를 날 상태로 전송합니다; 즉, {Enter}를 ENTER 키눌림, ^c를 Control-C, 등등으로 변환하지 않고 보이는 그대로 전송합니다. 이 옵션은 계속 섹션을 가진 핫스트링에 자동으로 효과를 발휘합니다. R0으로 이 옵션을 끌 수 있습니다.

SI 또는 SP 또는 SE [v1.0.43+]: 자동-교체 핫스트링이 키눌림을 전송하는 데 사용할 방법을 설정합니다. 이 옵션들은 서로 배타적입니다: 오직 한 번에 하나씩만 효과가 있습니다. 다음은 각 옵션을 기술합니다:

  • SI는 SendInput의 약자입니다. 전형적으로 다른 모드보다 월등한 속도와 신뢰성이 있습니다. 또다른 장점은 아래의 SendPlay와 같이 SendInput은 핫스트링의 텍스트 자동-교체가 일어나는 동안 타자되는 모든 것들을 대기시킵니다. 이 덕분에 키눌림이 교체 문자열 여기 저기로 흩어지지 않습니다. SendInput을 사용할 수 없으면, 핫스트링은 자동으로 대신에 SendPlay를 사용합니다.

  • SP는 SendPlay의 약자입니다. 핫스트링을 더 넓은 범위의 게임에 작동시킬 수 있습니다.

  • SE는 SendEvent의 약자입니다. 1.0.43 이전 버전에서는 이 값이 기본입니다.

위의 옵션 중 어느 것도 사용되지 않으면, 기본 모드는 v1.0.43 이후의 SendInput입니다. 그렇지만, SI 옵션과 다르게, SendInput을 사용할 수 없을 때 SendPlay 대신에 SendEvent을 사용합니다.

Z: 자주 사용되지 않는 이 옵션은 핫스트링이 촉발된 다음 핫스트링 인식자를 재설정합니다. 다른 말로, 스크립트는 이전에 타자한 모든 것들을 다 잊어 버리고 완전히 새로운 문자열을 기다리기 시작합니다. 이렇게 하면 원하지 않는 핫스트링의 촉발을 막을 수 있습니다. 예시를 위해, 다음 핫스트링을 연구해 봅시다:

:b0*?:11::
SendInput xx
return

위 예제는 Z 옵션이 없기 때문에, 111을 타자하면 (연속으로 1 세 개) 핫스트링이 두 번 촉발됩니다. 왜냐하면 가운데 1이 첫 촉발의 마지막 문자이고 또한 두 번째 촉발의 첫 문자이기 때문입니다. 기호 Z를 b0 앞에 추가하면, 1을 세 개 대신에 네 개를 타자해야 핫스트링이 두 번 촉발됩니다. Z0을 사용하면 이 옵션을 끌 수 있습니다.

기다란 교체

기다란 텍스트 교체를 생산하는 핫스트링은 계속 섹션을 사용하면 더 읽기 좋게 더 관리하기 쉽게 만들 수 있습니다. 예를 들어:

::text1::
(
상단과 하단의 반괄호 사이에 있는 텍스트는 무엇이든 문자 그대로 취급됩니다
여기에는 쉼표와 퍼센트 사인도 예외가 아닙니다.
기본값으로, 하드 캐리지 리턴(엔터)이 앞 줄과 이 줄 사이에 있어도 역시 유지됩니다.
    기본 값으로, 이 줄의 왼쪽 들여쓰기 (탭)도 유지됩니다.

이 기본 행위를 바꾸는 방법은 계속 섹션을 참조하십시오.
)

계속 섹션이 있으면 핫스트링도 역시 날 모드가 기본값이 됩니다. 이 특별한 기본값을 오버라이드하는 유일한 방법은 계속 섹션을 가진 각 핫스트링 안에 r0 옵션을 지정하는 것입니다 (예, :r0:text1::).

문맥-감지 핫스트링

#IfWinActive/Exist 지시어를 사용하면 선택된 핫스트링이 문맥을 감지하게 만들 수 있습니다. 문맥 감지 핫스트링은 활성창의 유형에 따라 다르게 교체하거나, 다르게 행위하거나, 또는 아무것도 하지 않습니다. 예를 들어:

#IfWinActive ahk_class Notepad
::btw::이 교체 텍스트는 노트패드에만 나타납니다.
#IfWinActive
::btw::이 교체 텍스트는 노트패드가 아닌 창에 나타납니다.

AutoCorrect

다음 스크립트는 핫스트링을 사용해 대략 4700 정도의 영어 철자 오류를 바로바로 교정합니다. Win+H 핫키가 포함되어 있어서 쉽게 더 많은 철자를 추가할 수 있습니다:

내려받기: AutoCorrect.ahk (127 KB)

저자: Jim Biancolo and Wikipedia's Lists of Common Misspellings

논평

%MyVar%와 같은 변수 참조는 현재 자동 교체 텍스트 안에서 지원하지 않습니다. 이를 해결하기 위해, auto-replace 같은 핫스트링을 만들지 마십시오. 대신에, 약어 바로 아래에 SendInput 명령어를 사용하고, 뒤이어서 단어 Return만 있는 줄을 배치하십시오.

교체한 뒤에 따로 더 스페이스나 탭을 전송하려면, 스페이스나 탭을 교체 뒤에 포함하고 마지막 문자를 액센트/백틱(`)으로 만드십시오. 예를 들어:

:*:btw::By the way `

좌/우 버튼을 클릭하면 핫스트링 인식자가 리셋됩니다. 다른 말로, 스크립트는 이전에 타자된 것들을 모두 잊어 버리고 전적으로 새로운 핫스트링을 기다립니다 (이것이 마음에 들지 않으면, , 다음 줄 #Hotstring NoMouse 를 스크립트에 지정하십시오). 이 "마우스 클릭에 리셋" 행위가 기본값입니다. 왜냐하면 각 클릭은 전형적으로 텍스트 삽입 위치를 이동시키거나 (캐럿) 키보드 초점을 새로운 콘트롤/필드로 설정하기 때문입니다. 그런 경우, 보통 다음이 바람직합니다:

  1. 물음표 옵션이 없더라도 핫스트링을 촉발시킵니다;
  2. 마우스를 클릭한 후에 타자한 것이 우발적으로 이전에 타자한 것과 더불어 유효한 약어를 형성할 때 촉발을 막습니다

내장 변수 A_EndChar에 종료 문자가 들어 있습니다. 타자하면 가장 최근의 자동-교체되지-않은 핫스링이 촉발됩니다. (* 옵션 때문에) 종료 문자가 필요하지 않으면, 비어 있습니다. A_EndChar는 Send 명령어를 사용하는 핫스트링을 만들 때 유용합니다. 또는 그의 행위가 타자된 종료 문자에 따라 바뀌어야 하는 핫스트링을 만들 때 유용합니다. 종료 문자 자체를 보내려면, SendRaw %A_EndChar%를 사용합니다 (SendRaw가 사용된 이유는 !{}와 같은 문자들이 보통의 Send 명령어로는 올바르게 전송되지 않기 때문입니다).

쉼표, 퍼센트 사인, 그리고 단일-쌍점은 핫스트링 정의 안에서 피신 시킬 필요가 없지만, 왼쪽에 스페이스나 탭이 있는 백틱과 쌍점은 피신시켜야 합니다. 완전한 목록은 피신 연속열을 참조하십시오.

{Enter}와 같은 Send 명령어의 특수 문자들은 (날 옵션이 사용되지 않는 한) 텍스트 자동-교체에 지원되지만, 핫스트링 약어 자체는 이를 사용하지 않습니다. 대신에, `n를 ENTER 키에 그리고 `t를 (또는 문자 그대로의 탭문자) TAB에 지정하십시오 (완전한 목록은 피신 연속열을 참조하십시오). 예를 들어, 다음 핫스트링 :*:ab`t::은 "ab"를 타자하고 바로 탭이 따라오면 촉발됩니다.

스페이스와 탭은 핫스트링 정의 안에서 문자 그대로 취급됩니다. 예를 들어, 다음은 두 개의 다른 결과를 생산합니다: ::btw::by the way 그리고 ::btw:: by the way.

핫스트링 약어는 40 문자를 넘을 수 없습니다. 이 길이를 초과하면 프로그램은 경고할 것입니다. 대조적으로, 핫스트링 교체 텍스트의 길이는 전송 모드가 기본값인 SendInput일 때 대략 5000 문자로 제한됩니다. 제한을 16,383 문자로 증가시키려면 다른 전송 모드중 하나로 전환하면 됩니다. 게다가, 핫스트링의 몸체에 SendPlay %MyVariable%를 사용하면 무제한 텍스트도 전송할 수 있습니다.

핫스트링이 정의된 순서에 따라 서로 간에 우선 순위가 결정됩니다. 다른 말로, 하나 이상의 핫스트링이 여러분이 타자한 것에 부합하면, 제일 먼저 나열된 것만 효과를 발휘합니다. 관련 주제: 문맥-감지 핫스트링.

여러분이 타자한 백스페이스는 모두 핫스트링의 감지를 위한 목적에 고려됩니다. 그렇지만, 화살표 키, PageUp, PageDown, Home, 그리고 End 키를 사용하여 편집기 안을 항해하면 핫스트링 인식 처리가 리셋됩니다. 다른 말로, 전적으로 새로운 핫스트링을 기다리기 시작합니다.

핫스트링은 활성 창이 키눌림을 무시할 때에도 타자될 수 있습니다. 다른 말로, 핫스트링은 촉발 약어가 전혀 보이지 않을지라도 여전히 촉발됩니다. 게다가, 여전히 백스페이스 키를 눌러 최근에 타자된 키눌림을 언두할 수 있습니다 (그 효과가 보이지 않을지라도 말입니다).

핫스트링 라벨에 Gosub는 Goto를 적용할 수 있습니다. 첫 번째 쌍점 쌍을 (다른 옵션 심볼을 포함하여) 그이 이름 앞에 포함하면 됩니다. 예를 들어: Gosub ::xyz. 그렇지만, 한-줄 (자동-교체) 핫스트링에는 점프해봐야 아무 것도 하지 않습니다. 기껏해야 return을 실행하는 것으로 끝납니다.

핫스트링은 관제가 되지 않고 보이지 않는 Input 명령어 동안에는 촉발되지 않지만, 보이는 Input은 핫스트링을 촉발시킬 수 있습니다.

기본값으로, 핫스트링은 AutoHotkey 스크립트가 생산하는 키눌림에는 촉발되지 않습니다. 그래서 핫스트링끼리 서로 촉발하는 무한 회돌이에 빠질 가능성을 피합니다. v1.1.06 이후 버전에서 이 행위는 #InputLevel과 SendLevel로 통제할 수 있습니다. 그렇지만, 자동-교체 핫스트링은 언제나 레벨 0으로 전송되고 그러므로 갈고리 핫키나 핫스트링을 촉발하지 않습니다.

어떤 목적에는 핫스트링보다 Input 명령어가 더 유연합니다. 예를 들어, 활성 창에 키눌림을 감출 수 있습니다 (게임 같은 경우). 또 Escape와 같이 문자가-아닌 종료 키를 지원합니다.

핫스트링을 담고 있는 스크립트는 키보드 갈고리를 자동으로 사용합니다.

핫스트링은 다음과 같은 방식으로 핫키와 동일하게 행위합니다:

  • Suspend 명령어에 영향을 받습니다.

  • #MaxThreads와 #MaxThreadsPerHotkey를 준수합니다

(#MaxThreadsBuffer는 제외).

  • 핫스트링을 담고 있는 스크립트는 자동으로 영속적이 됩니다.

  • 자동-교체-아닌 핫스트링은 기동될 때 새로 쓰레드를 생성합니다. 게다가, A_ThisHotkey와 같은 내장 핫키 변수를 갱신합니다.

알려진 한계: 자바 어플리케이션 같은 어떤 시스템에서는 핫스트링이 사용자가 (데드 키를 통하여) 방언 문자를 타자하지 못하도록 방해합니다. 이를 해결하려면, Suspend를 임시로 켤 수 있습니다 (모든 핫스트링이 꺼집니다).

핫스트링 도움 함수

안드레아스 보루타(Andreas Borutta)가 다음 스크립트를 제시했습니다. 핫스트링을 많이 사용한다면 아주 유용할 것입니다. Win+H (또는 또다른 핫키)를 누르면, 현재 선택된 텍스트가 핫스트링으로 변환됩니다. 예를 들어, 워드 프로세서에서 "by the way"를 선택했다면, Win+H를 누르면 여러분에게 그의 약자를 요구할 것입니다 (예, btw) 그리고 그 새 핫스트링을 스크립트에 추가합니다. 다음 스크립트를 재적재하여 그 핫스트링을 활성화합니다.

#h::  ; Win+H 핫키
; 현재 선택된 텍스트를 얻는다. "ControlGet Selected" 대신에
; 클립보드를 사용한다. 왜냐하면 대부분의 편집기에 작동하기 때문이다.
; (즉 워드 프로세서). 현재 클립보드 내용을 저장한다. 나중에 복구해 사용한다
; 평범한 텍스트만 처리하지만,
; 아무것도 처리하지 못하는 것보다는 낫다:
AutoTrim Off  ; 클립보드에 선두와 후미 공백을 그대로 유지한다.
ClipboardOld = %ClipboardAll%
Clipboard =  ; 탐지를 작동시키려면 빈 채로 시작해야 한다.
Send ^c
ClipWait 1
if ErrorLevel  ; ClipWait 시간 종료.
    return
; "날로-전송" 핫스트링에 사용하기 위해 CRLF와 LF를 `n로 교체한다:
; 다른 문자들에 대해서도 똑 같이 교체한다. 그렇지 않으면
; 날 모드에서 문제를 일으킬 수 있다:
StringReplace, Hotstring, Clipboard, ``, ````, All  ; 아래의 다른 것들과의 간섭을 피하기 위해 이걸 먼저 교체한다.
StringReplace, Hotstring, Hotstring, `r`n, ``r, All  ; MS Word, 등등에서 `r을 사용하는 것이 `n보다 더 잘 작동한다 .
StringReplace, Hotstring, Hotstring, `n, ``r, All
StringReplace, Hotstring, Hotstring, %A_Tab%, ``t, All
StringReplace, Hotstring, Hotstring, `;, ```;, All
Clipboard = %ClipboardOld%  ; 클립보드의 이전 내용을 복구한다.
; 이렇게 하면 InputBox의 캐럿이 사용자에게 더 편리한 위치로 이동한다:
SetTimer, MoveCaret, 10
; InputBox를 보여주고, 기본 핫스트링을 제공한다:
InputBox, Hotstring, New Hotstring, 지시한 삽입 지점에 약어를 타자하십시오. 원한다면 교체 텍스트도 편집할 수 있습니다.`n`n예제: :R:btw`::by the way,,,,,,,, :R:`::%Hotstring%
if ErrorLevel  ; 사용자가 Cancel을 눌렀다.
    return
IfInString, Hotstring, :R`:::
{
    MsgBox 약어를 제공하지 않았습니다. 핫스트링이 추가되지 않았습니다.
    return
}
; 그렇지 않으면, 핫스트링을 추가하고 스크립트를 재적재한다:
FileAppend, `n%Hotstring%, %A_ScriptFullPath%  ; 파일이 끝에 빈 줄에 없는 경우 앞에 `n을 배치한다.
Reload
Sleep 200 ; 성공하면, 재적재 때문에 이 실체는 Sleep하는 동안 닫힌다. 그래서 아래의 줄은 절대로 도달하지 못한다.
MsgBox, 4,, 방금 추가된 핫스트링은 모양이 올바르지 않습니다. 스크립트를 열어 편집하시겠습니까? 나쁜 핫트링의 위치는 스크립트 하단에 있습니다.
IfMsgBox, Yes, Edit
return

MoveCaret:
IfWinNotActive, New Hotstring
    return
; 그렇지 않으면, InputBox의 삽입 위치를 사용자가 약어를 타자할 곳으로 이동한다.
Send {Home}{Right 3}
SetTimer, MoveCaret, Off
return


키와 버튼 리맵

들어가는 말

한계: 아래에 기술하는 오토핫키의 리맵핑 특징은 일반적으로 윈도우즈 레지스트리를 통하여 리맵핑 하는 것에 비해 순수하지 못하며 효과도 그에 못 미칩니다. 각 접근법의 장점과 단점에 관한 것은 레지스트리 리맵핑을 참조하십시오.

키보드와 마우스 리맵하기

내장 리맵핑 특징의 구문은 OriginKey::DestinationKey 입니다. 예를 들어, 다음 줄만 들어있는 스크립트는 "a" 키를 마치 "b" 키처럼 행동하게 만듭니다:

a::b

위의 예제는 "b" 키 자체를 변경하지 않습니다. "b" 키는 계속해서 "b" 키눌림을 전송합니다. 다음 예제와 같이 다른 것에 리맵하지만 않는다면 말입니다:

a::b
b::a

위의 예제는 소문자를 사용합니다. 대부분의 목적에 소문자를 권합니다. 왜냐하면 상응하는 대문자도 리맵되기 때문입니다 (즉, Capslock이 "켜져" 있거나 Shift 키가 눌리면 대문자가 전송됩니다). 대조적으로, 대문자를 오른쪽에 지정하면 대문자를 강제합니다. 예를 들어, 다음 줄은 (Capslock이 꺼져 있는 한) "a"나 "A"를 누를 때 대문자 B를 생산합니다:

a::B

마우스 리맵핑: 키보드 대신에 마우스를 리맵하려면 같은 접근법을 사용합니다. 예를 들어:

MButton::Shift | 가운데 버튼을 마치 Shift 키처럼 행동하게 만듭니다.
XButton1::LButton | 네 번째 마우스 버튼을 왼쪽 버튼처럼 행위하게 만듭니다.
RAlt::RButton | 오른쪽 Alt 키를 오른쪽 마우스 버튼 처럼 행위하게 만듭니다.

다른 유용한 리맵핑:

Capslock::Ctrl | Capslock을 Control 키가 되도록 만듭니다. Capslock을 그대로 켜고 끌 수 있도록 하기 위해, 먼저 +Capslock::Capslock 리맵핑을 추가합니다. 이렇게 하면 Shift 키를 누른 채 Capslock을 누를 때 Capslock을 토글합니다. 두 리맵핑 모두 추가 수식키가 눌려 있는 것을 허용하기 때문에, 더 구체적으로 +Capslock::Capslock 리맵핑을 먼저 배치해야 Capslock::Ctrl 이 작동할 수 있습니다.
XButton2::^LButton | 다섯 번째 마우스 버튼을 (XButton2) Control-LeftClick이 되도록 만듭니다.
RAlt::AppsKey | 오른쪽 Alt 키는Apps 키가 됩니다 (문맥 메뉴를 여는 키입니다).
RCtrl::RWin | 오른쪽 Control 키를 오른쪽 Windows 키가 되도록 만듭니다.
Ctrl::Alt | Control 키를 Alt 키처럼 행위하도록 만듭니다. 그렇지만, alt-tab 문제를 참조하십시오.
^x::^c | Control-X가 Control-C를 생산합니다. 또 Control-Alt-X는 Control-Alt-C, 등등을 생산합니다.
RWin::Return | 오른쪽 Windows 키를 불능으로 만듭니다. 단순히 return을 할당했습니다.

이 예제들을 시험해 볼 수 있습니다. 새 텍스트 파일로 "Remap.ahk"와 같이 복사한 다음, 그 파일을 기동시킵니다.

완전한 키목록과 마우스 버튼 이름 목록은 키 리스트를 참조하십시오.

논평

지시어 #IfWinActive/Exist를 사용하면 선택된 리맵핑을 지정한 창에 대해서만 켤 수 있습니다. 예를 들어:

#IfWinActive ahk_class Notepad
a::b  ;  'a'키가 'b' 키를 전송하도록 만들지만, 오직 노트 패드 안에서만 일어납니다.
#IfWinActive  ; 잇다르는 리맵핑과 핫키가 모든 창에 효력을 미칩니다.

키나 마우스를 리맵핑 하는 일은 다음과 같은 관점에서 "완벽합니다":

  • Control나 Shift 같은 수식 키를 누른 채로 원래의 키를 타자하면 그 수식키가 목표 키에 효과를 발휘합니다. 예를 들어, b::a 는 Control-B를 누르면 Control-A를 생산합니다 .

  • Capslock은 일반적으로 리맵된 키에 정상 키와 마찬가지 방식으로 영향을 미칩니다.

  • 원래 키를 계속 누르고 있는 동안 목표 키나 목표 버튼이 눌려집니다. 그렇지만, 어떤 게임은 리맵핑을 지원하지 않습니다; 그런 경우, 키보드와 마우스는 리맵되지 않은 것처럼 행위합니다.

  • 리맵된 키는 눌려 있는 동안 자동으로 반복합니다 (마우스 버튼이 되도록 리맵된 키는 제외).

리맵된 키를 정상 키처럼 촉발시킬 수 있지만, 기본값으로 마우스 핫키나 갈고리 핫키는 촉발시킬 수 없습니다. (ListHotkeys를 사용하면 어느 핫키가 "갈고리")인지 알 수 있습니다. 예를 들어, 리맵핑 a::b 가 작동 중일 때, Ctrl-Alt-A를 누르면 ^!b 핫키가 촉발됩니다. 오직 ^!b 가 갈고리 핫키가 아닐 경우에만 그렇습니다. ^!b 가 갈고리 핫키일 경우, ^!a 를 핫키로 정의하면 Ctrl-Alt-A 는 Ctrl-Alt-B와 같은 행위를 수행합니다. 예를 들어:

a::b
^!a::
^!b::
ToolTip You pressed %A_ThisHotkey%.
return

대안적으로, v1.1.06 이후에서, #InputLevel를 사용하면 기본 행위를 오버라이드할 수 있습니다. 예를 들어:

#InputLevel 1
a::b

#InputLevel 0
^!b::
ToolTip You pressed %A_ThisHotkey%.
return

SendMode가 자동 실행 섹션에 사용중이면 (스크립트 상단 부분), 모든 리맵핑에 영향을 미칩니다. 그렇지만, 리맵핑은 Send {Blind}를 사용하고 SendPlay mode는 완전하게 {Blind}를 지원하지는 못하기 때문에, 어떤 리맵핑은 SendPlay 모드에서 제대로 작동하지 않을 수도 있습니다 (특, Control, Shift, Alt, 그리고 Win). 이를 돌아가려면, 리맵핑을 사용할 때 SendPlay를 자동-실행 섹션에 사용하지 마십시오; 그 다음부터 다른 곳에는 명령어 SendPlay vs. Send를 사용하시면 됩니다. 대안적으로, 리맵핑을 핫키로 번역할 수 있습니다. (아래에 기술하는 바와 같이) 명시적으로 SendEvent vs. Send를 호출합니다.

스크립트가 기동할 때, 각 리맵핑은 한 쌍의 핫키로 번역됩니다. 예를 들어, a::b 가 들어있는 스크립트는 실제로는 대신에 다음의 두 핫키가 들어 있습니다:

*a::
SetKeyDelay -1   ; 목표 키가 마우스 버튼이면, 대신에 SetMouseDelay가 사용됩니다.
Send {Blind}{b DownTemp}  ; DownTemp는 Down과 같습니다. 단, 다른 Send 명령어는 "b"가 전송되는 동안 눌려 있을 것이라고 가정하지 않습니다.
return

*a up::
SetKeyDelay -1  ; 왜 눌림-지속시간이 이 SetKeyDelays 중 하나로 지정되지 않는지 그 이유는 아래를 보십시오.
Send {Blind}{b Up}
return

그렇지만, 위의 핫키는 다음과 같은 상황에서 달라집니다:

  1. 소스 키가 LCtrl이고 목표 키가 Alt 키일 때, 줄 Send {Blind}{LAlt DownTemp}는 Send {Blind}{LCtrl Up}{LAlt DownTemp}로 교체됩니다. 소스가 RCtrl일 경우도 마찬가지입니다. 단, {RCtrl up}이 사용되는 경우는 예외입니다.

  2. 키보드 키가 마우스 버튼으로 리맵중일 때 (예, RCtrl::RButton), 위의 핫키는 SetKeyDelay 대신에 SetMouseDelay를 사용합니다. 게다가, 위의 첫 핫키는 다음으로 교체됩니다. 이 때문에 키보드의 자동-반복 특징은 반복적인 마우스 클릭을 만들어 내지 못합니다:
*RCtrl::
SetMouseDelay -1
if not GetKeyState("RButton")  ; 즉, 오른쪽 버튼이 아직 눌리지 않았습다.
   Send {Blind}{RButton DownTemp}
return

SetKeyDelay의 두 번째 매개변수는 (눌림 지속 시간) 위의 핫키에서 생략됩니다. {b down}과 {b up}과 같이 누름만 있거나 뗌만 있는 이벤트에는 눌림 지속 시간이 적용되지 않기 때문입니다. 그렇지만, Shift/Ctrl/Alt/Win 키의 상태 변화에는 적용됩니다. 예를 들어 a::B 나 a::^b 와 같은 리맵핑에 영향을 미칩니다. 결론적으로, 스크립트가 자동-실행 섹션를 통하여 효과를 준 모든 누름 지속 시간은 모든 리맵핑에 적용됩니다.

한 쌍의 키를 직접적으로 하나의 키에 리맵할 수는 없지만 (예, a & c::b 와 같이 작성하는 것은 무효입니다), 명시적으로 저 위에 있는 예제로부터 위 아래 핫키를 추가하면 이 효과를 얻을 수 있습니다: 그냥 *a::를 with a & c::로, 그리고 *a up::를 a & c up::로 교체하기만 하면 됩니다.

리맵핑은 위에 기술한 바와 같이 핫키로 번역되기 때문에, Suspend 명령어에 영향을 받습니다. 비슷하게, Hotkey 명령어는 리맵핑을 변경하거나 끌 수 있습니다. 예를 들어, 다음 두 명령어는 리맵핑 a::b 를 끕니다.

Hotkey, *a, off
Hotkey, *a up, off

Alt-tab 문제: 키나 마우스 버튼을 Alt 키가 되도록 리맵했다면, 그 키는 아마도 제대로 alt-tab을 작동시키지 못할 것입니다. 가능한 해결책은 핫키 *Tab::Send {Blind}{Tab}를 추가하는 것입니다 -- 그러나 진짜 핫키가 알트 탭을 수행할 때 간섭을 일으킬 가능성이 높다는 점을 명심하십시오. 그러므로, 오직 리맵된 alt-tab 핫키만 단독으로 사용할 경우에만 사용을 고려해야 합니다.

키 리스트 페이지에 나열된 키와 마우스 버튼 말고도, 소스 키로는 가상 키 (VKnn) 또는 스캔 코드 (SCnnn)도 가능합니다. 이는 특수 키 페이지에 기술되어 있습니다. 목표 키도 마찬가지입니다. 단, 목표 키는 선택적으로 가상 키 다음에 스캔 코드를 지정할 수도 있습니다. 예를 들어, sc01e::vk42sc030 는 대부분의 키보드 배치도에서 a::b 과 동등합니다.

키를 리맵하기 보다 끄려면, 그냥 반환되는 핫키로 만들면 됩니다. 예를 들어, F1::return 는 F1 키를 불능으로 만듭니다.

다음 키는 내장 리맵핑 메쏘드가 지원하지 않습니다:

  • 마우스 휠 (WheelUp/Down/Left/Right).

  • Pause 그리고 Break를 목표 키로 불가 (명령어 이름에 일치하기 때문에 불가).

  • 활괄호 {}를 목표 키로 불가. 대신에 VK/SC 방법을 사용하십시오; 예, x::+sc01A 그리고 y::+sc01B.

  • 퍼센트 사인(%)을 목표 키로 불가. 대신에 VK/SC 방법을 사용하십시오.

  • "Return"을 목표 키로 사용 불가. 대신에 "Enter"를 사용하십시오.

키보드로 마우스 커서 이동하기

키보드를 사용하여 마우스 커서를 이동할 수 있습니다. 예제는 완벽하게 기능을 갖춘 Keyboard-To-Mouse 스크립트를 보십시오. 스크립트는 부드러운 마우스 이동과, 가속, 기타 특징을 제공하기 때문에, 키보드로 마우스 작업을 많이 할 계획이 있다면 권장하는 접근법입니다. 대조적으로, 다음 예제는 좀 간단합니다:

*#up::MouseMove, 0, -10, 0, R  ; Win+UpArrow hotkey => 커서를 위로 이동시킵니다
*#Down::MouseMove, 0, 10, 0, R  ; Win+DownArrow => 커서를 아래로 이동시킵니다
*#Left::MouseMove, -10, 0, 0, R  ; Win+LeftArrow => 커서를 위로 왼쪽으로시킵니다
*#Right::MouseMove, 10, 0, 0, R  ; Win+RightArrow => 커서를 위로 오른쪽으로시킵니다

*<#RCtrl::  ; LeftWin + RightControl => Left-click (Control/Shift을 누른 채로 Control-Click 또는 Shift-Click).
SendEvent {Blind}{LButton down}
KeyWait RCtrl  ; 키보드 자동-반복이 마우스 클릭을 반복시키지 못하도록 막습니다.
SendEvent {Blind}{LButton up}
return

*<#AppsKey::  ; LeftWin + AppsKey => Right-click
SendEvent {Blind}{RButton down}
KeyWait AppsKey  ; 키보드 자동-반복이 마우스 클릭을 반복시키지 못하도록 막습니다.
SendEvent {Blind}{RButton up}
return

레지스트리의 "스캔코드 맵" 리맵핑하기

장점:

  • 레지스트리 리맵핑은 일반적으로 오토핫키의 리맵핑보다 더 순수하고 효과적입니다. 예를 들어 더 넓은 범위의 게임에 작동하고, alt-tab 문제도 없는 것으로 알려져 있으며, 그리고 AutoHotkey의 갈고리 핫키를 촉발시킬 수 있습니다 (반면 오토핫키의 리맵핑은 우회책이 필요합니다).
  • 레지스트리 엔트리를 손수 만들기로 결정했더라도 (아래에 설명), 키보드를 리맵하는데 절대 외부 소프트웨어가 필요하지 않습니다.KeyTweak을 사용하여 레지스트리 엔트리를 만든다고 할지라도, KeyTweak이 항상 실행중이어야 할 필요는 없습니다 (AutoHotkey와 다릅니다).

단점:

  • 레지스트리 리맵핑은 상대적으로 영구적입니다: 변경을 언두하거나 새 변경이 효과가 있으려면 재부팅해야 할 필요가 있습니다.
  • 그의 효과는 전역적입니다: 특정한 사용자나 어플리케이션 또는 로케일에 맞게 리맵핑을 만드는 것은 불가능합니다.
  • Shift, Control, Alt, 또는 AltGr 으로 수식된 키눌림은 전송하지 않습니다. 예를 들어, 소문자를 대문자로 리맵할 수 없습니다.
  • 키보드만 지원합니다 (AutoHotkey는 마우스 리맵핑과 제한적이나마 조이스틱 리맵핑을 지원합니다).

레지스트리에 변경을 적용하는 법: 레지스트리를 통하여 키를 리맵하는 데 적어도 두 가지 방법이 있습니다:

  1. KeyTweak (무료웨어)와 같은 프로그램을 사용하여 시각적으로 키를 리맵합니다. 대신 레지스트리를 변경해 줍니다.
  2. 수동으로 키를 리맵합니다. .reg 파일 (평범한 텍스트)를 만들어 레지스트리 안으로 적재하면 됩니다. 이 방법은 www.autohotkey.com/forum/post-56216.html#56216에 예시되어 있습니다.

관련 주제

키와 마우스 버튼 목록
GetKeyState
조이스틱 리맵핑하기


키목록 (키보드, 마우스, 조이스틱)

마우스

.

일반
LButton | 왼쪽 마우스 버튼
RButton | 오른쪽 마우스 버튼
MButton | 중간 또는 휠 마우스 버튼
고급
XButton1 | 4번째 마우스 버튼, 전형적으로 Browser_Back과 같은 기능을 수행합니다.
XButton2 | 5번째 마우스 버튼, 전형적으로 Browser_Forward와 같은 기능을 수행합니다.
휠
WheelDown | 휠을 아래로 돌립니다 (가까워지게).
WheelUp | 휠을 위로 돌립니다 (멀어지게).
WheelLeft WheelRight | [v1.0.48+]: 좌우로 스크롤합니다. 윈도우즈 비스타 이상을 요구합니다. 두 번째 휠을 가진 또는 휠을 좌우로 돌릴 수 있는 마우스와 함께 (모두는 아님) 이것을 핫키로 사용할 수 있습니다. 어떤 경우, 대신에 마우스와 함께 따라오는 드라이버를 사용해야만 이 특징을 제어할 수 있습니다. 특정 마우스와 상관없이, Send와 Click을 사용하여 프로그램에서 지원하기만 하면 수평으로 스크롤할 수 있습니다.

키보드

주의: 기호와 숫자 키의 이름은 기호나 숫자 키와 같습니다. 예를 들어. : b는 "b" 키이고 5는 "5" 키입니다.

일반

CapsLock

캡스 락

Space

스페이스 바

Tab

탭 키

Enter (또는 Return)

엔터 키

Escape (또는 Esc)

Esc 키

Backspace (또는 BS)

백스페이스

커서 콘트롤

ScrollLock

스크롤 락

Delete (또는 Del)

삭제 키

Insert (또는 Ins)

삽입 키

Home

홈 키

End

엔드 키

PgUp

페이지 업 키

PgDn

페이지 다운 키

Up

위 화살표 키

Down

아래 화살표 키

Left

왼쪽 화살표 키

Right

오른쪽 화살표 키

숫자패드

NumLock ON

NumLock OFF

Numpad0

NumpadIns

0 / 삽입 키

Numpad1

NumpadEnd

1 / 엔드 키

Numpad2

NumpadDown

2 / 아래 화살표 키

Numpad3

NumpadPgDn

3 / 페이지 다운 키

Numpad4

NumpadLeft

4 / 왼쪽 화살표 키

Numpad5

NumpadClear

5 / 보통 아무일도 안함

Numpad6

NumpadRight

6 / 오른쪽 화살표 키

Numpad7

NumpadHome

7 / 홈 키

Numpad8

NumpadUp

8 / 위 화살표 키

Numpad9

NumpadPgUp

9 / 페이지 업 키

NumpadDot

NumpadDel

소수 점 / 삭제 키

NumpadDiv

NumpadDiv

나누기

NumpadMult

NumpadMult

곱하기

NumpadAdd

NumpadAdd

더하기

NumpadSub

NumpadSub

빼기

NumpadEnter

NumpadEnter

엔터 키

기능키

F1 - F24

대부분의 키보드 상단에 있는 12 개 이상의 기능키.

수식키

LWin

왼쪽 윈도우즈 로고 키. <# 핫키 접두 심볼에 상응합니다.

RWin

오른쪽 윈도우즈 로고 키. ># 핫키 접두 심볼에 상응합니다.
주의: Control/Alt/Shift와 다르게, 범용의/중립적 "Win" 키는 없습니다. OS가 지원하지 않습니다. 그렇지만, # 수식키를 가진 핫키는 어느쪽 Win 키로도 촉발됩니다.

Control (or Ctrl)

콘트롤 키. 핫키처럼 (Control::) 틸드 접두 심볼이 붙지 않은 한, 뗄 때 촉발됩니다. ^ 핫키 접두 심볼에 상응합니다.

Alt

알트 키. 핫키처럼 (Alt::) 틸드 접두 심볼이 붙지 않는 한, 뗄 때 촉발됩니다. ! 핫키 접두 심볼에 상응합니다.

Shift

쉬프트 키. 핫키처럼 (Shift::) 틸드 접두 심볼이 붙지 않는 한, 뗄 때 촉발됩니다. + 핫키 접두 심볼에 상응합니다.

LControl (or LCtrl)

왼쪽 콘트롤 키. <^ 핫키 접두 심볼에 상응합니다.

RControl (or RCtrl)

오른쪽 콘트롤 키. >^ 핫키 접두 심볼에 상응합니다.

LShift

왼쪽 쉬프트 키. <+ 핫키 접두 심볼에 상응합니다.

RShift

오른쪽 쉬프트 키. >+ 핫키 접두 심볼에 상응합니다.

LAlt

왼쪽 Alt 키. <! 핫키 접두 심볼에 상응합니다.

RAlt

오른쪽 알트 키. >! 핫키 접두 심볼에 상응합니다.

주의: 키보드 레이아웃에 RAlt 대신 AltGr이 있다면, 그것을 핫키로 사용할 수 있습니다. 다음에 기술하는 바와 같이 <^>!처럼 접두 심볼 처리를 해 주면 됩니다. 게다가, LControl & RAlt::은 AltGr 자체를 핫키로 만들어 줍니다.

멀티미디어

Browser_Back

뒤로

Browser_Forward

앞으로

Browser_Refresh

갱신

Browser_Stop

멈춤

Browser_Search

검색

Browser_Favorites

즐겨찾기

Browser_Home

홈페이지

Volume_Mute

음소거

Volume_Down

소리 줄이기

Volume_Up

소리 높이기

Media_Next

다음 트랙

Media_Prev

이전 트랙

Media_Stop

중지

Media_Play_Pause

연주/정지

Launch_Mail

기본 이메일 프로그램 기동

Launch_Media

기본 미디어 플레이어 기동

Launch_App1

내 컴퓨터 기동

Launch_App2

계산기 기동

주의: 위에 나열된 각 키에 할당된 기능은 윈도우즈의 레지스트리를 변경하면 오버라이드할 수 있습니다. 다음 테이블은 대부분의 윈도우즈 버전에서 각 키의 기본 기능을 보여줍니다.

특수

AppsKey

메뉴 키. 이 키는 우클릭 문맥 메뉴를 요청합니다.

PrintScreen

화면 인쇄

CtrlBreak

Pause

정지 키

Break

Break key. Pause와 동일하기 때문에, 핫키에서 ^CtrlBreak 를 사용하십시오. ^Pause 이나 ^Break 는 사용하지 마십시오.

Help

도움 키. 이 키는 보통 대부분의 키보드에 존재하지 않습니다. 보통 F1과 같지 않습니다.

Sleep

수면 키. 어떤 키보드에서 수면 키는 잘 작동하지 않을 수 있습니다.

SCnnn

nnn 에 키의 스캔 코드를 지정합니다. 위에 언급하지 않은 비정상 키들을 인식합니다. 자세한 것은 특수 키를 참조하십시오.

VKnn

nn 에 키의 십육진 가상 키 코드를 지정합니다. 자주 사용되지 않는 이 방법은 어떤 유형의 핫키가 키보드 갈고리를 요구하는 것을 방해할 수도 있습니다. 예를 들어, 다음 핫키들은 키보드 갈고리를 사용하지 않지만, 부작용으로서 Home 또는 NumpadHome을 누르면 촉발됩니다:

^VK24::MsgBox Control 키를 누른 채로 Home 또는 NumpadHome를 눌렀습니다.

알려진 한계: VK 핫키가 키보드 갈고리를 사용하도록 강제되어 있으면, *VK24 이나 ~VK24 와 같이, 두 키가 아니라 둘 중에 하나의 키에만 촉발됩니다 (예, NumpadHome에 촉발되면 Home은 촉발되지 않음). VKnn 메쏘드에 관한 더 자세한 정보는 특수 키를 참조합니다.

Joystick

Joy1 through Joy32: 조이스틱의 버튼. 다음 테스트 스크립트를 사용하면 여러분이 보유한 조이스틱의 버튼 개수를 알 수 있습니다. ^ (control) 그리고 + (shift) 같은 핫키 접두 심볼은 지원하지 않습니다 (그렇지만 GetKeyState을 대안으로 사용할 수 있습니다). 조이스틱 버튼을 누른다고 해서 언제나 활성창으로 "뚫고 들어가는" 것은 아니라는 사실을 주의하십시오. 그 창이 조이스틱 버튼 누름을 탐지하도록 설계되어 있다면 침투하지 못할 수 있습니다.

다음 조이스틱 콘트롤 이름은 핫키로 사용할 수 없지만, GetKeyState와 함께 사용할 수 있습니다:
JoyX, JoyY, and JoyZ: 조이스틱의 X (수평), Y (수직), 그리고 Z (고도/깊이) 축.
JoyR: 조이스틱의 러더 또는 4 번째 축.
JoyU and JoyV: 조이스틱의 5번째 6 번째 축.
JoyPOV: The point-of-view (hat) control.
JoyName: 조이스틱 또는 조이스틱 드라이버의 이름.
JoyButtons: 조이스틱이 지원하는 버튼의 개수 (언제나 정확한 것은 아님).
JoyAxes: 조이스틱이 지원하는 축의 개수.
JoyInfo: 다음 기호로 구성되는 문자열을 제공합니다. 조이스틱이 갖춘 능력을 알려줍니다: Z (Z 축), R (R 축), U (U 축), V (V 축), P (POV 콘트롤), D (POV 콘트롤은 이산적으로 설정됩니다), C (POV 콘트롤은 연속적으로 설정됩니다). 예제 문자열: ZRUVPD

다중 조이스틱: 컴퓨터에 여러 조이스틱이 있고 첫 번째 마우스 말고도 다른 조이스틱을 사용하고 싶다면, 조이스틱 번호를 (최대 16) 컨트롤 이름 앞에 붙이십시오. 예를 들어, 2joy1은 두 번째 조이스틱의 첫 번째 버튼입니다.

주의: 스크립트에게 조이스틱을 인식시키지 못하고 있다면, 어떤 보고에 의하면 조이스틱 번호를 1말고 다른 번호를 지정할 필요가 있다고 합니다. 오직 하나의 조이스틱만 있다고 할지라도 말입니다. 어떻게 이런 상황이 일어나는지 그리고 그것이 정상인 것인지는 잘 모르지만, 조이스틱 테스트 스크립트에서 조이스틱 번호를 가지고 실험해 보면 이 방법이 여러분의 시스템에 적용이 될지 알 수 있을 것입니다.

다음도 참조하십시오:
조이스틱 리맵핑: 조이스틱으로 키눌림과 마우스 클릭을 전송하는 방법.
Joystick-To-Mouse 스크립트: 조이스틱을 마우스로 사용하기.

손에 든 리모콘

손에 든 리모콘으로부터의 신호에 반응합니다. WinLIRC 클라이언트 스크립트를 사용하십시오.

특수 키

키보드나 마우스에 위에 나열된 키가 없더라도, 핫키로 사용할 수 있습니다. 다음 단계를 따르십시오:

  1. 적어도 하나의 스크립트는 키보드 갈고리를 사용하여 실행 중임을 확인합니다. 스크립트에 키보드 갈고리가 설치되어 있는지 확인하려면 메인 창을 열고 메뉴바에서 "View->Key history"를 선택해 보면 됩니다.

  2. 스크립트의 트레이 아이콘을 더블클릭하여 메인 창을 엽니다.

  3. 키보드에서 "미스테리 키"중 하나를 누릅니다.

  4. 메뉴 항목 "View->Key history"를 선택합니다.

  5. 페이지 아래로 감아 내립니다. 아래 어딘가에 누른 키에 대한 키-누름 그리고 키-뗌 이벤트가 있을 겁니다. 주의: 어떤 키는 이벤트를 발생시키지 않습니다 그리하여 여기에서 보이지 않습니다. 이럴 경우라면 직접적으로 그 특정한 키를 핫키로 만들 수 없습니다. 왜냐하면 키보드 드라이버나 하드웨어가 너무 아래 레벨에서 처리하고 있어서 오토핫키가 접근할 수 없기 때문입니다. 가능한 해결책은, 더 아래를 보십시오.

  6. 키를 탐지할 수 있으면, 리스트의 두 번째 컬럼에 세 자리 십육진 값을 적습니다 (예, 159).

  7. 이 키를 핫키로 정의하려면, 다음 예를 따르십시오:
SC159:: ; 159를 키 값으로 교체하십시오.
MsgBox, %A_ThisHotKey% was pressed.
return

역 방향: 다른 키를 "미지의 키"가 되도록 리맵하려면, 다음 예제를 따르십시오:

; 159를 위에서 발견한 값과 교체합니다. (필요하면) FF를 가상 키로 교체합니다.
; 가상 키 코드는 Key History 화면의 첫 컬럼에서 발견할 수 있습니다.
#c::Send {vkFFsc159}

또다른 해결책: 키나 마우스 버튼을 Key History 화면에서 탐지할 수 없으면, 다음 중 하나를 시도해 보면 도움이 될 것입니다:

1. 마우스나 키보드에 함께 따라오는 소프트웨어의 환경을 재구성하면 (종종 제어판이나 시작 메뉴를 통하여 접근할 수 있습니다) "미지의 키"가 다른 키눌림을 전송하도록 만들 수 있습니다. 그런 키눌림은 이제 스크립트에서 핫키로 정의할 수 있습니다. 예를 들어, 미지의 키가 Control+F1을 전송하도록 구성했다면, 스크립트에서 ^F1::을 사용해 간접적으로 그 키를 핫키로 만들 수 있습니다.

2. DllCall: 휴먼 인터페이스 장치 지원을 시도해 봅니다. 또 RawInput*와 같은 키워드로 포럼을 검색해 보실 수도 있습니다.

3. 다음은 마지막 의존책입니다. 일반적으로 절망적일 경우에만 시도하십시오. 성공의 가능성이 매우 낮고 원하지 않는 부작용을 야기해 다시 돌이킬 수 없을 수도 있기 때문입니다:
키보드나 마우스에 따라오는 소프트웨어를 제거합니다. 또는 드라이버를 보다 표준적인 드라이버 예를 들어 OS에 내장된 드라이버로 교체합니다. 성공한 한다면 여러분의 전용 드라이버가 제공하는 특징이 없더라도 살아갈 수 있다는 확신을 가질 수 있습니다.


Scripts

스크립트 파일 코드 페이지

대화식 디버깅


변수 및 표현법


함수


객체


버전 정보


감사의 말


소프트웨어 이용약관

GNU 일반적인 공공의 이용약관

1991년 6월 버전2

Copyright (C) 1989, 1991 Free Software Foundation, Inc.

51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA

Everyone is permitted to copy and distribute verbatim copies

of this license document, but changing it is not allowed.

Preamble

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.

To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.

Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.

Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.

The precise terms and conditions for copying, distribution and modification follow.

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.

1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.

You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:

a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.

In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:

a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.

4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.

6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.

7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.

9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.

10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

NO WARRANTY

11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

END OF TERMS AND CONDITIONS