본문 바로가기

AUTOHOTKEY/레퍼런스

스크립트

스크립트

스크립트의 구성

스크립트는1행1명령으로,1행은16,383아르바이트 이내라고 하는 제한이 있다.
커멘드는, 커멘드명과 인수를 콤마로 단락지어 기술한다.
인수에 문자열을 지정하는 경우에서도, 「"」등에서 괄충분해는 하지 않고, 그대로 기술한다.

「{」라고 하는 내용의 행이 있으면, 「}」라고 하는 내용의 행이 나타날 때까지가 하나의 블록이 된다.조건 분기나 반복 처리로 복수의 커멘드를 실행하는 경우에 사용한다.

커멘드와는 별도로 「#」(으)로 시작되는 프리프로세서 지령과 같은 것이 있다.
이것은, 스크립트가 실행되기 전의 해석의 단계에서 처리되므로, 인수에 변수의 참조를 포함하는 것은 할 수 없다.

값의 데이터 형식

변수나 커멘드의 인수로서 사용되는 값은, 모두 문자열로서 보관 유지된다.
값이 특정의 포맷의 경우, 정수·소수·일자 시각으로서 계산등에서 사용할 수 있다.
변수의 내용이 이러한 형식일지를 판정하려면 , If var is [not] type(을)를 사용한다.
어떠한 서식이 각 커멘드가 출력하는 정수·소수의 문자열 표현 포맷은, SetFormat커멘드로 설정할 수 있다.

변수

변수에 문자열이나 수치를 격납할 수 있다.
변수명에 사용되는 문자의 제한은 느슨하다.
변수에 문자열을 대입하려면 , 일반적인 스크립트 언어와 같게 「=」(을)를 사용한다.
또, 인수로 지정한 변수명의 변수에 결과를 격납하는 커멘드도 있다.( Input등).이 경우는,C언어의 포인터 인도와 같은 것이라고 생각하면 좋다.
값을 지정하는 (곳)중에 변수명의 전후를 「%」(으)로 둘러싼 것 기술하면, 변수의 내용이 전개된다.이것은Perl등에 볼 수 있는 문자열내의 변수의 전개와 같은 것.
변수명을 지정 해야할 때 로, 변수의 내용을 전개하는 가변 변수도 가능.( WinGet의Examples에 예 있어)

MyVar = 123abc
MsgBox, MyVar is %MyVar%

변수가 정수의 경우,64비트 정수 상당한 치를 취급할 수 있다.
변수가 소수의 경우,double값상당한 치를 취급할 수 있다.

변수와는 별도로, 환경 변수도 취급할 수 있다. EnvSet커멘드로 환경 변수에 대입한다.
이 환경 변수는, Run커멘드등에서 기동한 프로그램내로부터 참조할 수 있다.
변수의 전개에서는, 통상의 변수도 환경 변수도 전개할 수 있지만, 미정도리의 변수는 길이0의 문자열에 전개된다.

EnvSet,TestEnv,this is a test env
Run,%ComSpec% /K set TestEnv
;cmd.exe하지만 기동해,TestEnv에 격납된 내용을 표시한다

AutoHotkey옆에서 준비된 편입 변수에 관해서는, 편입 변수의 항(을)를 참조.
많은 편입 변수는 대입에 의해 직접 변경하는 것은 할 수 없다.
잘 사용되는 편입 변수로서 커멘드의 실행 결과를 격납한다 ErrorLevel변수가 있다.

변수는 항상 문자열로서 격납되어1변수의 용량의 상한은64KB( #MaxMem지령으로 변경 가능).
「var=」라고 하도록(듯이), 하늘의 값을 할당하는 것으로, 할당할 수 있었던 메모리를 개방할 수 있다.

변수의 계산

변수가 수치의 경우, EnvAdd, EnvSub, EnvMult, EnvDiv커멘드로 사칙 연산을 실시할 수 있다.
이것들 커멘드의 생략형으로서 「+=」,「-=」,「*=」,「/=」(이)가 사용할 수 있다.
좌변에는 변수명이 오지만, 우변에는 값이 오지 않으면 안 되기 때문에, 「%」(으)로 사이에 두어 변수의 내용을 전개하도록(듯이) 할 필요가 있다.

posX = 0
posX += %speedX%

Transform커멘드로 각종의 수치계산을 실시할 수 있다.

이러한 커멘드에서는, 제1인수와 제2인수의 어느쪽이나가 정수라면 결과는 정수에, 어느 쪽인지 한편에라도 소수 형식의 값이 포함되어 있으면 결과는 소수가 된다.
정수로 제산을 실시해 결과를 소수로 얻고 싶은 경우, 다음과 같이 소수 형식의 값으로 나누어 줄 필요가 있다.

var=10
var/=3.0

또,0(을)를 더하는 등의 결과가 변하지 않는 계산을 실시하는 것으로, 형식의 변환만을 실시할 수 있다.

SetFormat,FLOAT,0.0	;소수의 소수점 이하를 잘라 버리도록(듯이) 한다
var+=0		;var의 내용이 정수 형식에 변환된다
var+=0.0	;var의 내용을 소수 형식에 변환

조건 분기

If문장으로 조건 분기를 실시할 수 있다.
else문장으로 조건에 일치하지 않았을 때의 처리도 기술할 수 있다.
비교 조건은,if var = value그렇다고 하는 형태로 기술할 수 있다.
비교 연산자는, 「=」, 「<>」(not equal), 「>」 「<」 「>=」 「<=」(이)가 사용할 수 있다.
좌변에는 변수명이 오지만, 우변에는 값이 오지 않으면 안 되기 때문에, 「%」(으)로 사이에 두어 변수의 내용을 전개하도록(듯이) 할 필요가 있다.

If MyVar > %Max%
	MsgBox,over
else
	MsgBox,not over

그 외에도, 몇개의 조건문을 사용할 수 있다.

If/IfEqual/IfNotEqual/IfLess/IfLessOrEqual/IfGreater/IfGreaterOrEqual
변수의 비교(「=」 「<>」 「>」 「<」 「>=」 「<=」와 같다)
IfExist / IfNotExist
파일의 존재의 유무
IfInString / IfNotInString
문자열중으로 지정의 문자열이 포함될지
If var [not] in values / If var [not] contains values
var의 내용이values에 열거한 문자열과 일치할지
If var is [not] type
변수의 데이터 형식
IfMsgBox
제일 최근의MsgBox커멘드로 밀린 버튼
IfWinActive
지정한 윈도우가 액티브할지
IfWinExist
지정한 윈도우가 존재할지

If계의 커멘드에서는, 아래와 같이 실행시키고 싶은 커멘드(블록의 시작을 포함한다)(을)를 같은 행에 기술할 수 있다.
If커멘드의 뒤의 커멘드는 콤마로 단락짓지만,else커멘드의 뒤는 스페이스에서 단락짓는 것에 주의.

MsgBox,1,aaa,bbb
IfMsgBox,OK,{
	MsgBox,OK
}
else IfMsgBox,Cancel,{
	MsgBox,cancel
}

반복 처리

Loop문장으로 반복 처리를 사용할 수 있다.
반복 회수나, 대상 데이터는 편입 변수(으)로서 취득할 수 있다.
Continue, Break문장을 사용할 수 있다.
while(이)나for(와)과 같은 종료 조건을 사용한 반복은 할 수 없기 때문에, 자기 부담으로If문장과Break문장으로 기술할 필요가 있다.

반복에는, 이하의 종류가 있다.

Loop
지정 회수의 반복
LoopFile
와일드 카드 등에 매치하는 파일이나 폴더 각각 대하는 처리
LoopReg
레지스트리의 지정 키 이하의 키에 대한 처리
LoopReadFile
파일을1행씩 읽으면서 처리
LoopParse
문자열의1문자마다, 혹은 지정의 단락 기호로 단락지어진 필드 마다 처리

써브루틴 호출해, 점프

Gosub문장으로 써브루틴 호출이, Goto그리고 점프를 사용할 수 있다.
Gosub(으)로부터 돌아오려면 , Return문장을 사용한다.
Goto문장은 프로그램의 가독성이 손상되므로, 별로 추천 되지 않는다.

점프처의 라벨은, 「LabelName:」(와)과 같은 코론으로 끝나는 행으로 기술된다.
또, hot key 라벨도 지정할 수 있다.

스렛드 세치기

이하의 커멘드에서도, 라벨에 의한 써브루틴 지정을 실시한다.
이러한 이유에 의한 써브루틴 호출에서는, 스렛드의 세치기를 한다.

SetTimer
타이머에 정기적으로 실행되는 써브루틴을 지정
Menu
커스텀 메뉴를 작성해, 선택되었을 때에 실행되는 써브루틴을 지정
GUI
GUI(을)를 작성해, 버튼이 밀렸을 때 등에 실행되는 써브루틴을 지정
OnExit
스크립트가 종료할 경우에 실행되는 써브루틴을 지정
Hotkey
지정된 hot key가 밀렸을 때에 실행되는 써브루틴을 지정
핫 스트링
특정의 문자열을 타이프 쳤을 때에 써브루틴이 실행되도록(듯이) 설정

식의 대입/조건 분기

전술의 변수의 대입·계산·조건 분기와는 별도로, 복잡한 식을 이용한 대입(이)나 조건 분기도 사용할 수 있다.

또, 일부의 커멘드에 있는 단독으로 수치를 지정하는 인수에서는, 식에서 값을 지정할 수도 있다.
그 이외의 인수에서는, 「% a+b」(와)과 같이 인수의 최초로 「%」라고 반각 스페이스를 붙이면, 식을 지정할 수 있다.

식의 대입/조건 분기에서는, 다른 커멘드와는 변수의 취급 방법등이 차이가 난다.

Var1=100
Var2:=Var1+10

식의 대입에는, 「:=」(을)를 사용한다.
식중에서 변수를 사용할 때는, 「%」에서는님 하지 않고서, 그대로 기술한다.
숫자열은 수치로서 계산된다.

Var1=100
Var2=10
Index=1
VarName=Var2
Var3:=Var%Index%+%VarName%
a=1
b=2
c=3
xxx1xxx23xxx=10000
Var:=xxx%a%xxx%b%%c%xxx

식중에 「%」에서는씨로 변수명을 쓰면, 그 내용이 전개된 다음, 변수명으로서 다루어진다.
전후의 변수명으로서 타당한 문자와 아울러 변수명으로서 다루어진다.

변수 참조를 전개한 결과가 식 등에 되는 경우, 부정한 변수명으로서 에러가 된다.

If(Name="Taro" or Name="타로")
 MsgBox,He is Taro.

식에 의한 조건 분기는 상기와 같이,If에 이어 식을 괄호로 둘러싸고 쓴다.
문자열은, 「"」(으)로 사이에 둔다.
하늘의 문자열을 나타내려면 , 「""」라고2개 계속하고 쓰면 좋다.
식중에 「"」(을)를 포함한 문자열을 사용하고 싶은 경우, 「"」대신에 「""」라고2개 계속하고 쓴다.

SetFormat,FLOAT,0.1
Var:=0.0+0.0
MsgBox,%Var%
Var:=10/3
MsgBox,%Var%
Var:=10/3 + 10/3 + 10/3
MsgBox,%Var%

산술 연산자의 어느 쪽인지가 소수치였던 경우, 결과는 소수치가 된다.
또, 연산 결과가 소수가 되는 경우도, 자동적으로 소수치가 된다.

산술 연산의 결과가 소수의 경우, 계산 도중은 부동 소수점치로 보관 유지되어 최종적으로 SetFormat커멘드로 지정된 형식에서 변수에 격납된다.

「1/0」 「x+*y」등과 같이, 정상적으로 처리할 수 없는 연산은, 하늘의 문자열로서 다루어진다.

문자열 연산자


Exp1 . Exp2 2개의 변수나 문자열, 식의 결과를 문자열로서 연결한다.
Exp1(와)과 「.」, 「.」라고Exp2의 사이에는 스페이스를 비우지 않으면 안 된다.

산술 연산자


-A 「-」(을)를 붙여진 항이나 식은 부의 값을 나타낸다.
A+B 가산
A-B 제산
A*B 곱셈
A/B 제산
A//B 결론 짓지 않는 제산.
예를 들어, 「7//3」(은)는2에, 「7//-3」(은)는-2(이)가 된다.
몇개의 피연산자가 소수 표현이었던 경우, 소수로서 제산한 상을 넘지 않는 최대의 정수에 말 수 있다.또, 이 경우 결과는 소수 표현이 된다.(「7//3.0」(은)는2.0, 「7//-3.0」(은)는-3.0(이)가 된다)
A**B 누승.A의B승
A(와)과B(은)는 모두 소수치를 사용할 수 있다.
A(을)를 부의 값으로 하는 것은 할 수 없다.

비트 연산자

비트 연산 할 수 있는 것은 정수치만.
소수치는, 정수치로 변환하고 나서 계산된다.
내부적으로는64비트 부호 첨부 정수로 다루어지고 있는 모양. 부호 첨부64비트 정수의 범위(-9223372036854775808..9223372036854775807)의 범위에 들어가지 않는 경우,65비트째부터 위는 잘라 버릴 수 있다.


~A A의 비트를 반전한다.
32비트 부호 없음 정수의 범위내의 값은, 하위32비트만 반전된다.(부의 값의 경우,32비트에서도64비트에서도 결과는 같다)
A|B 비트의 논리합
A&B 비트의 논리적
A^B 비트의 배타적 논리합
A>>B A(을)를 오른쪽으로B비트만 시프트 한다.
논리 오른쪽 시프트이므로, 최상위비트가1그렇지만, 열린 좌측에는 항상0하지만 채울 수 있다.
산술 오른쪽 시프트를 하고 싶을 때는,2**B그리고 나눈다.
A<<B A(을)를 왼쪽으로B비트만 시프트 한다.

논리 연산자

수치의 제로나 하늘의 문자열은 가짜(False)(으)로서 다루어져 그 이외는 진(True)(으)로서 다루어진다.

논리 연산의 결과를 변수에 대입하면, 가짜(False)의 경우 「0」, 진(True)의 경우 「1」(이)가 대입된다.


NOT A
! A
진위를 반전한다. !쪽이 연산자의 우선도가 높다.
A OR B
A || B
논리합
A AND B
A && B
논리적

비교 연산자

주로 조건 분기에서 사용하지만, 비교 연산의 결과를 변수에 대입하는 경우, 가짜(False)(이)라면 「0」, 진(True)(이)라면 「1」(이)가 대입된다.

수치가 아닌 것을 비교하는 경우, 문자열로서 문자 코드의 줄 순서로 비교된다.
수치여도, 「"」(으)로 둘러싸여 있는 경우는, 문자열로 간주해진다.(례:「"10"」) 이 때, StringCaseSense커멘드로 설정이 변경되지 않는 이상 대문자 소문자의 차이는 무시된다.(「=」 「==」(을)를 제외한다)


A > B A하지만B보다 크면 진(True)(이)가 된다.
A < B A하지만B보다 작으면 진(True)(이)가 된다.
A >= B A하지만B이상이라면 진(True)(이)가 된다.
A <= B A하지만B이하라면 진(True)(이)가 된다.
A = B A(와)과B하지만 동치 때 진(True)(이)가 된다.
문자열의 연산에 있어서의 대문자 소문자의 차이는 항상 무시된다.
A == B A(와)과B하지만 동치 때 진(True)(이)가 된다.
문자열의 연산에 있어서의 대문자 소문자의 차이는 항상 구별된다.
A <> B
A != B
A(와)과B하지만 동치가 아닐 때 진(True)(이)가 된다.

주소 연산자


&Var 변수Var의 격납된 메모리 영역의 주소가 된다.
*Addr 주소가 정수Addr그리고 나타내지는 메모리 영역의 아르바이트치(0...255)(이)가 된다.
*Addr:=Asc("x")」(와)과 같이 대입 끝에는 할 수 없다.
값을 변경하려면 , 「DllCall("RtlFillMemory", UInt, Addr, UInt, 1 , UChar, Asc("x")) 」(와)과 같이 한다.

함수

함수의 정의 방법

함수란, 인수로서 값을 받아, 어떠한 처리를 실시해, 결과를 돌려주는 써브루틴이다.
함수의 정의는, 이하와 같이 한다.
함수의 내용이1행만으로도, 「{」 「}」(은)는 생략 할 수 없다.

함수명(인수 리스트){
함수 본체
}

함수명에는, 반각영숫자와 「_」(언더 바)등을 사용할 수 있다.
인수 리스트에는, 인수의 이름을 「,」(으)로 단락지어 열거한다.
함수가 인수를 필요로 하지 않는 경우, 인수 리스트는 비운다.
함수명과 「(」의 사이에는, 스페이스등을 넣어선 안 된다.
함수 본체는, 반드시 「{」와「}」의 행으로 둘러싸 블록화해야 한다.「)」의 직후에 「{」(을)를 쓰지 못하고, 반드시 다음의 행에 쓰지 않으면 안 된다.
함수내에서는, 인수로서 주어진 값을 변수와 같이 참조할 수 있다.
「return」에 이어 기술했다 하지만 돌아가 값으로 해서 호출해 바탕으로 돌려주어진다.
return하지만 없는 경우, 하늘의 문자열이 돌려주어진다.

아래와 같은 예에서는,Add그렇다고 하는 함수명의 함수를 정의하고 있다.
Add함수는x(와)과y의2개의 인수를 받아,x(와)과y(을)를 더한 값을 돌아가 값으로 해서 돌려준다.

Add(x, y){
	return x + y
}

함수의 정의는, 함수 정의의 내부 이외라면 어디에 써도 상관없다.
스크립트 실행중에, 함수 정의의 행에 실행이 옮겼을 경우, 함수 정의의 마지막까지는 스킵 되어 실행되지 않는다.

함수의 호출

함수는, 다음의 예의 같게 중(안)에서 사용할 수 있다.

Sum:=Add(2,3)

상기의 예에서는,Add함수의 인수x(으)로서 「2」, 인수y(으)로서 「3」(을)를 주어 호출해, 그 결과를 변수 「Sum」에 대입하고 있다.

Add(Add(1,2),3+4)」(와)과 같이, 함수 호출의 인수에 식이나 함수 호출을 기술하는 일도 가능.
그 경우, 우선 안쪽의 식이 왼쪽의 인수로부터 계산되어 다음에 그것을 인수로서 외측의 함수가 실행된다.

변수에 대입하지 않고, 함수의 호출만을 실시하는 것도 가능하다.
아래와 같은 예에서는,2개의 인수의 화를 다이얼로그 표시하는 함수를 정의해, 인수에2(와)과3(을)를 주어 호출하고 있다.

ShowAdd(x,y){
	MsgBox,% x+y
}
ShowAdd(2,3)

함수중에서 다른 함수를 호출하는 것도 가능하다.
호출의 심도의 상한은159회로,160번째의 호출을 하려고 하면AutoHotkey의 프로그램이 부정 종료한다.

%FuncName%()」(와)과 같이 해 동적으로 함수명을 지정할 수 없다.

인수의 디폴트치

Add(p1,p2,p3=0,p4=0,p5=0){
	return p1+p2+p3+p4+p5
}

상기와 같이, 인수 리스트의 인수명의 뒤에 「=」에 이어 디폴트치를 기술하는 것으로, 인수를 생략 했을 경우에는 그 값이 사용되도록(듯이) 하는 것이 가능하다.
상기의 예에서는, 「Add(1,2)」라고 했을 경우는3하지만 돌아가, 「Add(1,2,3)」라고 하면6하지만 돌아간다.
디폴트치로서 설정할 수 있는 것은, 수치(정수)(와)과 「""」,true,false뿐인다.
복수의 인수를 생략 하는 것은 가능하지만, 인수의 도중만을 생략 할 수 없다.상기의 예에서는, 「Add(1,2,,3)」라고 할 수 없다.
또, 이것에 수반해, 「x, y=0, z」(와)과 같이 디폴트치를 가지는 인수의 뒤에, 디폴트치를 가지지 않는 인수를 설정할 수 없다.

로컬 변수

함수 중(안)에서 사용되는 변수( 편입 변수를 제외하다)(은)는, 함수의 소환 마다 작성되고 함수로부터 돌아올 때에 파기된다.
그 때문에, 함수외에서는 참조할 수 없는 로컬인 변수가 된다.
따라서, 이하의 스크립트는 기대 그대로의 동작을 하지 않는다.

;x의 값을 설정하는 함수를 만들고 싶다
SetX(val){
	x:=val
}
x:=0
SetX(10)
MsgBox,%x%

글로벌 변수의 이용

함수내로부터 통상의 변수(글로벌 변수)에 액세스 하려면 , 「global」에 이어 액세스 하고 싶은 변수명을 기술한다.복수의 변수명을 「,」(으)로 단락지어 정리하고 쓸 수 있다.
이하의 스크립트는 기대 그대로의 동작이 된다.

;x의 값을 설정하는 함수를 만들고 싶다
SetX(val){
	global x
	x:=val
}
x:=0
SetX(10)
MsgBox,%x%

디폴트로 글로벌 변수가 되도록(듯이) 한다

함수의 최초로 「global」라고만 쓴 행이 있으면, 함수내에 기술된 모든 변수가 글로벌 변수가 된다.
이 때, 「local」에 이어 변수명을 쓰면, 그 변수만 로컬 변수가 된다.복수의 변수명을 「,」(으)로 단락지어 정리하고 쓸 수 있다.
함수의 최초로 「global」의 행을 쓰는 대신에, 「local」의 변수 선언을 쓰는 것도, 글로벌 변수를 디폴트로 할 수 있다.

함수내에서 「Array%i%」(와)과 같은 동적 변수를 사용했을 경우, 로컬 변수로서 다루어진다.
다만, 그 이름의 로컬 변수가 존재하지 않고, 글로벌 변수라면 존재하는 경우, 그 글로벌 변수가 사용된다.
로컬에도 글로벌에도 존재하지 않고, 변수를 새롭게 작성해야 하는 경우, 로컬 변수로서 만들어진다.

StringSplit커멘드등에서 배열을 작성하는 경우, 통상은 로컬 변수로서 작성된다.
다만, 배열의 최초의 요소가global선언되고 있는 경우는, 모든 요소가 글로벌 변수로서 작성된다.

스태틱 변수

같은 함수 중(안)에서 공유되는 변수를 작성하려면 「static」에 이어 변수명을 쓴다.복수의 변수명을 「,」(으)로 단락지어 정리하고 쓸 수 있다.
스태틱 변수는, 함수 중(안)에서 밖에 참조할 수 없지만, 같은 함수로 하나의 변수가 공유된다.

AAA(){
	static CalledTimes
	CalledTimes++
	MsgBox,%CalledTimes%번째
}

인수의 참조 인도

함수에 값은 아니고 변수의 참조를 건네주는 것을 참조 인도라고 말한다.
참조 인도를 이용하면, 함수로부터 호출해 원의 변수를 변경할 수 있다.
이것을 이용하면,2개이상의 정보를 호출해 바탕으로 알리는 것이 가능하게 된다.
인수를 참조 인도로 하려면 , 인수 리스트로 인수명의 전에 「ByRef 」(을)를 붙인다.
참조 인도가 되어 있는 인수에 변수 이외의 식을 지정하면 실행시 에러가 된다.미정도리의 변수를 지정하는 것은 가능.

참조 인도에서는, 함수 호출시에 변수의 내용의 카피를 하지 않기 때문에, 큰 문자열을 인수에 건네줄 때의 효율이 좋아진다.

아래와 같은 예에서는,2개의 변수의 내용을 바꿔 넣는 함수 「Swap」(을)를 정의하고 있다.

Swap(ByRef Left, ByRef Right){
	temp := Left
	Left := Right
	Right := temp
}

식중에서 논리OR/AND(와)과 함수를 사용하는 경우

식중에서 「and」(이)나 「or」(으)로 연결된 논리식을 실행하는 경우, 왼쪽에서 실행해, 대답이 확정한 시점에서 평가를 종료한다.
예를 들어, 「a or b」에서는, 「a」(이)가true의 경우, 식 전체가true(이)가 되는 것은 분명해서 「b」의 평가는 행해지지 않는다.
같이 「a and b」에서는, 「a」(이)가false의 경우, 식 전체가false(이)가 되는 것이 분명해서 「b」의 평가는 행해지지 않는다.
지휘중의 함수 호출은 평가시에 실행되므로, 「a or B()」(와)과 같은 식에서는, 「B()」(이)가 실행되지 않는 경우가 있다.

재귀 호출

함수중에서 그 함수 자신을 호출하는 테크닉을 재귀 호출이라고 한다.
아래와 같은 예는, 인수로 주어졌다n의 계승을 요구하는 함수이다.

Factorial(n){
	If n=1
		return 1
	else
		return n*Factorial(n-1)
}

덧붙여 재귀 호출을 실시하는 함수로, 「ByRef」에 의한 참조 인도의 인수에 로컬 변수를 주면, 호출처의 해당 변수가 참조되게 되어 버린다.
따라서, 이하의 스크립트는 올바르게 동작하지 않는다.

Factorial(ByRef n){
	If n=1			;(2)여기의n그럼 호출원의x(이)가 아니고, 불려 간 측의x하지만 참조되어 버린다
		return
	x:=n-1
	Factorial(x)	;(1)여기서 로컬 변수x(을)를 참조 건네주면
	n*=x
}

함수내로부터의Gosub/Goto/Exit

함수내에서는, 함수의 내외의 써브루틴을 「 Gosub」(으)로 호출할 수 있다.
함수외의 써브루틴을 호출했을 경우, 불려 간 써브루틴에서는 함수내의 로컬 변수는 호출할 수 없다.

함수내에서는, 함수내의 라벨에게만 「 Goto」(으)로 점프 할 수 있다.
함수외의 라벨에Goto그리고 점프 하려고 했을 경우, 그 행은 무시된다.

함수내에서 실행중의 스렛드(을)를 종료하는 「 Exit」커멘드를 실행하면, 함수의 호출해 원래대로 돌아가는 일 없이 그 시점에서 스렛드가 종료한다.

함수에 의한 스크립트의 모듈화

함수의 정의만을 쓴 스크립트를 「 #Include」지령으로 읽어들여 사용하도록(듯이) 하면, 스크립트의 보수성이 향상한다.
다른 사람이 만든 스크립트를 자신의 스크립트에 짜넣고 싶은 경우 등에, 변수명의 중복을 신경쓰지 않아도 되므로 편리하다.

편입 함수

AutoHotkey에는, 미리 정의된 편입 함수가 준비되어 있다.
이것들은, 보통 함수와 같이 사용할 수 있다.

편입 함수는, 같은 이름의 함수를 정의하는 것으로 덧쓰기할 수 있다.


실행 제어 관련
서식 설명
OnMessae(MsgNumber [, "FunctionName"]) 스크립트가 소유하는 윈도우에MsgNumber그리고 지정한 메세지가 보내졌을 때에,FunctionName그리고 지정된 함수가 불려 가도록(듯이) 등록한다.
자세한 것은 링크처의 개별 해설을 참조.
DllCall("[DllFile\]Function" [, Type1, Arg1, Type2, Arg2, "Cdecl ReturnType"]) DllFile안의Function함수를 호출해 돌아가 값을 얻는다.
TypeN하ArgN의 형태를 지정.
자세한 것은 링크처의 개별 해설을 참조.
VarSetCapacity(Var [, RequestedCapacity]) Var그리고 지정한 변수로서 확보하는 메모리 영역의 사이즈를RequestedCapacity(으)로 설정한다.
자세한 것은 링크처의 개별 해설을 참조.
IsLabel("LabelName") LabelName그리고 지정된 이름의 라벨이 존재하면 「1」(을)를, 존재하지 않으면 「0」(을)를 돌려준다.
LabelName에는, Gosub커멘드등에서 사용하는 것과 같은 라벨명을 지정할 수 있다.

시스템 관련
서식 설명
FileExist(FilePattern) FilePattern에 일치하는 파일이 존재하는 경우, 파일의 속성이 FileGetAttrib커멘드로 사용되는 서식에서 돌려주어진다.
파일이 존재하지 않는 경우는, 길이 제로의 공문자열이 돌려주어진다.
파일이 존재하지만, 어떤 속성도 붙지 않은 경우는 「X」(이)가 된다.
FilePattern에는 구체적인 파일명외, 와일드 카드 문자로서 「*」 「?」(이)가 사용할 수 있다.
FilePattern에 상대 패스를 지정했을 경우, A_WorkingDir(으)로부터의 상대 패스로 간주해진다.
GetKeyState(KeyName [, "P" or "T"]) KeyName하지만 눌러 내려지고 있었을 경우 「1」(이)가, 눌러 내릴 수 지 없었던 경우 「0」(이)가 돌아간다.
KeyName하지만 부정했던 경우는, 길이 제로의 공문자열이 돌아간다.
제2인수에 「"P"」(을)를 지정했을 경우, 프로그램이 생성하는 가상적인 눌러 인하 상태를 무시해, 물리적인 눌러 인하 상태를 판정한다.
제2인수에 「"T"」(을)를 지정했을 경우,Capslock, Numlock, Scrolllock, Insert키의 타글 상태를 취득할 수 있다.
GetKeyState커멘드의 설명도 참조.
WinExist("WinTitle" [, "WinText", "ExcludeTitle", "ExcludeText"]) 해당하는 윈도우가 존재하면, 그 윈도우의 핸들을 돌려준다.
존재하지 않으면 「0」(을)를 돌려준다.
인수의 지정의 방법에 대해서는 윈도우 지정의 방법(을)를 참조.
WinActive("WinTitle" [, "WinText", "ExcludeTitle", "ExcludeText"]) 해당하는 윈도우가 액티브하면, 그 윈도우의 핸들을 돌려준다.
그렇지 않으면 「0」(을)를 돌려준다.
인수의 지정의 방법에 대해서는 윈도우 지정의 방법(을)를 참조.

문자열 관련
서식 설명
Asc(String) String그리고 주어진 문자열의1아르바이트눈의ASCII코드를 돌려준다.String하지만 길이 제로의 문자열이었던 경우는0하지만 돌아간다.
Chr(N) N그리고 지정되었다ASCII코드로 나타내진다1문자를 문자열로서 돌려준다.
N에는0(으)로부터255의 사이의 값을 지정한다.그 이외를 지정했을 경우는, 길이 제로의 공문자열이 돌아간다.
StrLen(String) String그리고 주어진 문자열의 길이를 아르바이트수로 돌려준다.
동작의 자세한 것은 StringLen커멘드를 참조.
InStr(String, Needle [, CaseSensitive=false, StartingPos=1]) String그리고 주어진 문자열 중(안)에서,Needle그리고 주어진 문자열이 최초로 출현하는 위치를 돌려준다.
String의1문자눈은 「1」로서 다루어진다.
발견되지 않았던 경우는 「0」(이)가 돌아간다.
CaseSensitive(을)를true(으)로 하면, 대문자 소문자를 구별한다.
StartingPos(을)를 「2」이상으로 설정하면,StartingPos문자눈 이후를 검색한다.
StartingPos하지만String의 길이 이상이 되는 경우는, 「0」(이)가 돌아간다.
StartingPos(을)를 「0」(으)로 하면,String안의 제일 마지막Nedle의 위치가 돌아간다.
StartingPos(을)를 지정했을 경우에서도, 돌아가 값은 문자열의 선두로부터 센 위치가 된다.

수학 함수
서식 설명
Abs(N) 수치N의 절대치를 돌려준다
Ceil(N) 수치N보다 큰 최소의 정수를 정수치 표현으로 돌려준다
Floor(N) 수치N보다 작은 최대의 정수를 정수치 표현으로 돌려준다
Round(N[,Place]) 수치N(을)를 소수점 이하Place자리수로 사사오입 한다.
Place(을)를 생략 했을 경우는, 소수점 이하를 사사오입 하고 정수가 돌아간다.
Place에 부의 수를 지정했을 경우는, 소수점보다 위에서 사사오입 된다. Place에 성의 수를 지정했을 경우는 소수치가, 그 이외는 정수치가 돌아간다.
Sqrt(N) N의 제곱뿌리가 소수치로 돌아간다
Exp(N) 네피아수e의N승을 돌려준다.
N에는 부의 수나 소수도 지정 가능.
Log(N) N의10(을)를 바닥으로 한 대수를 소수치 표현으로 돌려준다
Ln(N) N의 자연대수를 소수치 표현으로 돌려준다
Mod(N,Divisor) N(을)를Dvisor그리고 나눈 너무를 돌려준다.
예를 들어,Mod(5,3)하2(이)가 된다.
부호는N(와)과 같게 된다.
소수치를 지정하는 일도 가능.
어느 쪽인가의 인수가 소수치였던 경우는, 돌아가 값도 소수치가 된다
Sin(Radian) Radian그리고 지정된 각도의 싸인이 돌아간다
Cos(Radian) Radian그리고 지정된 각도의 코사인이 돌아간다
Tan(Radian) Radian그리고 지정된 각도의 탄젠트가 돌아간다
ASin(N) N의 아크 싸인이 라디안으로 돌아간다
ACos(N) N의 아크 코사인이 라디안으로 돌아간다
ATan(N) N의 arctangent가 라디안으로 돌아간다

어느 수학 관련 함수도, 인수가 수치가 아니었던 경우나, 계산 불능인 값이 주어졌을 경우는 길이 제로의 공문자열이 돌아간다

아크 싸인이란,Sin하지만 원래의 수치가 되는 각도이다.

이스케이프 문자

파일 패스의 「\」의 이스케이프의 필요를 없애기 위해, 이스케이프 문자는 「`」(Shift+@)(이)가 되어 있다.
이하에 나타내는 escape sequence를 사용할 수 있다.
그 이외의 문자를 이스케이프 했을 경우, 그 문자 자신이 된다.(례:「`x」→「x」)
#EscapeChar지령그리고 이스케이프 문자를 변경할 수 있다.


escape sequence 일람
기호 의미
`, 「,」(콤마)의 문자.
커멘드의 단락과 구별하기 위해(때문에), 이스케이프가 필요.
덧붙여 커멘드의 마지막 인수내에서는, 문자로서의 콤마인 것이 자명하기 때문에, 콤마를 이스케이프 할 필요는 없다.
`; 「;」(세미콜론)의 문자.
반각 스페이스인가Tab문자의 다음에 오는 경우만, 코멘트의 개시 기호와 구별하기 위해서 이스케이프 할 필요가 있다.
`:: 문자열 「::」(코론 둘).핫 스트링등에서 사용.
`% 「%」(퍼센트 기호)
`n 개행(LF/0x0A)
`r 복귀(CR/0x0D)
`t Tab문자(0x09)
`v 수직Tab(0x0B)
`b BackSpace문자(0x08)
`a Bell문자(0x07)
`f 개페이지(0x0C)
`` 「`」자신.
(이스케이프 문자2개로 이스케이프 문자 자신이 된다.)

코멘트

줄머리가 세미콜론의 행은 코멘트행.
커멘드의 후에 반각 스페이스를 비우고 세미콜론이 있으면, 그 이후는 코멘트.
/* …… */그리고 둘러싸인 범위도 코멘트가 된다.

스크립트의 기동과Auto-execute섹션

스크립트는 읽어들여 때에 해석되어 최적화된다.
문법 에러는 읽어들여 때에 체크되어 수정될 때까지 실행할 수 없다.

스크립트가 읽히면, 최초로 Return인가 Exit혹은 hot key 라벨하지만 나타나는지, 스크립트의 마지막에 이를 때까지가 실행된다.
이 부분을,auto-execute섹션이라고 부른다.

hot key 라벨이나 #Persistent지령, Lock계 키의 고정등에서 상주 상태로 되지 않는 경우,auto-execute섹션이 종료하면 스크립트는 종료한다.

hot key, 커스텀 메뉴 아이템, 타이머그리고 기동된다 스렛드그럼, 아래와 같은 커멘드로의 설정은 각각 독립하고 있다.
이러한 초기치는Auto-execute섹션으로 설정할 수 있다.
설정을 하기 전에 스렛드가 불려 가면, 기대한 동작이 되지 않는 것이 있으므로,Auto-execute섹션의 가능한 한 최초의 분으로 설정하면 좋다.

스크립트의 커멘드 라인 인수

AutoHotkey의 커멘드 라인의 서식은 이하와 같다.

AutoHotkey.exe [Switches] [Script Filename] [Script Parameters]
CompiledScript.exe [Switches] [Script Parameters]

Switches에는 이하의 것을 지정.

/f
경고 다이얼로그를 내지 않고 , 강제적으로 기동
/r
스크립트를 재독 보고 하고 싶을 때에 사용.
/ErrorStdOut
문법 에러를 다이얼로그 표시하지 않고 표준 출력에 출력한다

Script Filename(을)를 생략 했을 경우는, 기동시의 작업 디렉토리의AutoHotkey.ini하지만 읽힌다.
파일이 존재하지 않는 경우, 디폴트의 파일을 작성할까를 묻는 다이얼로그가 나온다.
스크립트에 인수를 건네주고 싶은 경우는 생략 할 수 없다.

Script Parameters에는 임의의 수의 문자열을 스페이스 단락으로 건네줄 수 있다.
스페이스를 포함한 경우는 「"」(으)로 둘러싼다.
건네받은 인수는, 변수에 격납되어 스크립트내에서 「%1%」, 「%2%」……(이)라고 하는 식으로 해 참조할 수 있다.
「%0%」에는 인수의 수가 격납된다.
덧붙여 스크립트 자신 패스를 취득하려면 「%A_ScriptFullPath%」변수를 사용한다.

스크립트의 디버그

스크립트가 기대 대로에 동작하고 있는지를 확인하려면 , 스크립트의 요소 요소에 MsgBox커멘드를 넣고, 동작 상황이나 변수의 내용을 표시하면 좋다.
그 밖에도, ListVars커멘드와 Pause커멘드로 변수의 내용을 정리해 표시한다고 하는 방법도 있다.
이러한 디버그는, 액티브 윈도우가 바뀌어 버리면 정상적으로 동작하지 않는 듯한 곳에서는 사용할 수 없기 때문에 주의가 필요하다.

스크립트의EXE화

ahk2exe.exe(을)를 사용하는 것으로, 스크립트를 실행 파일화하는 것이 가능.
실행 파일은UPX압축된다.
역컴파일러도 공개되고 있지만, 패스워드로 암호화하면 역 컴파일을 막을 수 있다.
작성한 실행 파일의 배포는 자유.

컴파일 된 스크립트에서는 통상, task tray 메뉴로부터 메인 윈도우를 표시하는 것은 할 수 없다.
Menu,TRAY,MainWindow」(으)로 메인 윈도우를 표시 가능하게 할 수 있다.

스크립트측으로부터, 컴파일 된 상태로 실행되고 있는지 어떤지를 알려면 , 「A_IsCompiled」변수를 사용한다.「1」(이)라면 컴파일 되고 있다.

Ahk2exe.exe(은)는 커멘드 라인으로부터 직접 컴파일을 실행하는 일도 가능

Ahk2exe.exe /in <infile.ahk> [/out <outfile.exe>][/icon <iconfile.ico>][/pass <passphrase>]

'AUTOHOTKEY > 레퍼런스' 카테고리의 다른 글

함수  (0) 2007.11.07
  (0) 2007.11.07
스크립트  (1) 2007.11.07
SetKeyDelay  (0) 2007.11.07
[그외] ErrorLevel  (0) 2007.11.07
Menu  (0) 2007.11.07