スクリプト仕様

提供: AutoHotkey Wiki
移動: 案内検索
リファレンス > スクリプト仕様 - 公式ドキュメント

スクリプトの構成[編集]

スクリプトは基本的に1行1命令で、1行は16,383バイト以内で記述をする。

コマンドは、コマンド名と引数をカンマで区切って記述する。
コマンド名の直後は、空白文字で区切れば、カンマを省略してもよい。(第1引数に空白を指定する場合を除く)
コマンドの引数に文字列を指定する場合でも、「"」などで括ったりはせず、そのまま記述する。ただし関数等の式を利用する場合は文字列は引用符で囲う必要がある。

{」という内容の行があると、「}」という内容の行が現れるまでが一つのブロックとなる。条件分岐や繰り返し処理で複数のコマンドを実行する場合に使用する。

コマンドとは別に「#」で始まるプリプロセッサ指令のようなものがある。
これは、スクリプトが実行される前の解析の段階で処理されるので、引数に変数の参照を含めることは出来ない。

複数行に渡る式・コマンド[編集]

コマンド・式の分割[編集]

一行に一つのコマンドを書いていくのが基本であるが、単項演算子(++ および --)を除く演算子、あるいはカンマを行頭に置くと、その行は前の行の続きとみなされるようになり、結果的にコマンドを分割して記述することが可能となる。これによりスクリプトの可読性を上げることが可能となる。

; 例1) コマンドの分割
MsgBox, 2
      , ダイアログタイトル
      , メッセージ

PostMessage, msg            ; コメントを記述することも可能
           , wParam
           , lParam
           ,, ahk_id %hwnd%

; 例2) 条件毎に行を分ける
If (var1 == 100
   && var2 == 200)
{
   ; ...
}

; 例3) 複数行に渡る関数の記述
ret := DllCall("FunctionName"
             , "Ptr", &struct
             , "Int")

なお、複数行に渡るコマンドはスクリプトの起動時には連結した状態でロードされるため、エラーメッセージの行番号はコマンドの先頭行となるので注意。

ヒアドキュメント[編集]

ヒアドキュメントは「(」で始まる行が開始、「)」で始まる行を終了とした内部の(複数)行をそのまま文字列として扱えるようになるもの。これには文中の改行も含まれる。

MsgBox,this
(
 is
 long
) message

上記の例の結果は、

this is
 long message

のように出力される。

ヒアドキュメント内は「%」記号を用いた変数展開が有効であるため、以下のように利用することも可能。

str = 
(
the quick brown %animal%
  jumps over the lazy dog 
)

また、式(ここでは:= 演算子を用いた代入)でも利用が可能であるが、引用符の位置に注意が必要である。

str := "
(
the quick brown " . animal . "
  jumps over the lazy dog 
)"

ヒアドキュメントは最初の「(」に続いてオプションの指定が可能である。 オプションは半角スペース区切りで複数指定が可能である。
利用可能なオプションは以下の通り。

JoinStr 各行の間に挿入する文字列を改行(`n)以外に変更する。単に「Join」と指定すると、区切り文字無しで連結される。
Str には15文字までの文字列が指定できる。このStr 部分でのみ、`sが半角スペースとみなされる。
; 例)
(Join<br`s/>
~~~
~~~
)
LTrim 各行の行頭の半角スペースやTab文字を無視する。
; 例)
If (foo = 100)
{
    MsgBox,
    (LTrim
       ~~~~
       %A_Space%~~~~
    )
}

インデントを行っているスクリプトではこれを利用すると可読性を上げることが出来るが、行頭のスペースやタブを外したくないような場合は、
%A_Space% や %A_Tab% のようにして特定行のインデントを残すようにする必要がある。

RTrim0 行末の末尾の半角スペースやTab文字を無視しないようにする。
C ;」による行コメント、行末コメントを有効にする。
(C LTrim
  Abc def ghi ; これはコメント
  jkl mno pqr
)
% %」による変数展開を抑制する。
(%
変数 Var( = %Var% ) は展開されません。
)
` `n`t などの特殊文字がそのまま出力されるようになる。
, カンマ( , )が自動的に「`,」としてエスケープされるのを抑止する(コマンドの引数の区切りなどとして扱われるようになる)。

値のデータ形式[編集]

変数やコマンドの引数として使われる値は、すべて文字列として保持される。
値が特定のフォーマットの場合、整数・小数・日付時刻として計算などで使うことができる。
変数の内容がこれらの形式であるかどうかを判定するには、If var is [not] typeを使用する。
どのような書式が 各コマンドが出力する整数・小数の文字列表現フォーマットは、SetFormatコマンドで設定できる。

変数[編集]

変数に文字列や数値を格納することができる。変数名に使われる文字の制限は緩い。
( AHKL AHKLではオブジェクト文法が導入され、従来のAHKで変数名に利用できた記号類は殆ど使えなくなった。詳細はAutoHotkey_Lの互換性を参照のこと。)

変数に文字列を代入するには、一般的なスクリプト言語と同様に「=」を使う。
また、引数で指定した変数名の変数に結果を格納するコマンドもある。(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 / IfWinNotActive 指定したウィンドウがアクティブかどうか。
IfWinExist / IfWinNotExist 指定したウィンドウが存在するかどうか。

If系のコマンドでは、下記のように実行させたいコマンド(ブロックの始まりを含む)を同じ行に記述することができる。
Ifコマンドのあとのコマンドはカンマで区切るが、Elseコマンドのあとはスペースで区切ることに注意。

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

繰り返し処理[編集]

Loop文で繰り返し処理が使用できる。
繰り返し回数や、対象データは組み込み変数として取得できる。
ContinueBreak文が使用できる。
whileやforのような終了条件を使った繰り返しは出来ないので、自前でIf文とBreak文で記述する必要がある。

繰り返しには、以下の種類がある。

Loop 指定回数の繰り返し
LoopFile ワイルドカードなどにマッチするファイルやフォルダそれぞれに対する処理
LoopReg レジストリの指定キー以下のキーに対する処理
LoopReadFile ファイルを1行ずつ読みながら処理
LoopParse 文字列の1文字ごと、あるいは指定の区切り記号で区切られたフィールドごとに処理

サブルーチン呼び出し、ジャンプ[編集]

Gosub文でサブルーチン呼び出しが、Gotoでジャンプが使用できる。
Gosubから戻るには、Return文を使用する。
Goto文はプログラムの可読性が損なわれるので、あまり推奨されない。

ジャンプ先のラベルは、「LabelName:」のようなコロンで終わる行で記述される。
また、ホットキーラベルも指定できる。

スレッド割り込み[編集]

以下のコマンドでも、ラベルによるサブルーチン指定を行う。
これらの理由によるサブルーチン呼び出しでは、スレッドの割り込みが行われる。

SetTimer タイマーで定期的に実行されるサブルーチンを指定
Menu カスタムメニューを作成し、選択されたときに実行されるサブルーチンを指定
GUI GUIを作成し、ボタンが押されたときなどに実行されるサブルーチンを指定
OnExit スクリプトが終了するときに実行されるサブルーチンを指定
Hotkey 指定されたホットキーが押されたときに実行されるサブルーチンを指定
ホットストリング 特定の文字列をタイプしたときにサブルーチンが実行されるように設定

式の代入/条件分岐[編集]

前述の変数の代入・計算・条件分岐とは別に、複雑な式を用いた代入条件分岐も使用できる。

また、一部のコマンドにある単独で数値を指定する引数では、式で値を指定することもできる。
それ以外の引数では、「% 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には、あらかじめ定義された組み込み関数が用意されている。
これらは、普通の関数と同じように使用できる。

組み込み関数は、同じ名前の関数を定義することで上書きできる。

実行制御関連
OnMessage(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の間の値を指定する。それ以外を指定した場合は、長さゼロの空文字列が返る。
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のアークタンジェントがラジアンで返る。

いずれの数学関連関数も、引数が数値でなかった場合や、計算不能な値を与えられた場合は長さゼロの空文字列が返る

アークサインとは、Sinが元の数値になるような角度のことである。

エスケープ文字[編集]

ファイルパスの「\」のエスケープの必要をなくすため、エスケープ文字は「`」(Shift+@)になっている。
以下に示すエスケープシーケンスが使える。
それ以外の文字をエスケープした場合、その文字自身になる。(例:「`x」→「x」)
#EscapeChar指令でエスケープ文字を変更できる。

エスケープシーケンス一覧
`, ,」(カンマ)の文字。
コマンドの区切りと区別するため、エスケープが必要。
なお、コマンドの最後の引数内では、文字としてのカンマであることが自明なため、カンマをエスケープする必要は無い。
`; ;」(セミコロン)の文字。
半角スペースかTab文字の次に来る場合のみ、コメントの開始記号と区別するためにエスケープする必要がある。
`:: 文字列「::」(コロン二つ)。ホットストリングなどで使用。
`% %」(パーセント記号)
`n 改行(LF/0x0A)
`r 復帰(CR/0x0D)
`t Tab文字(0x09)
`v 垂直Tab(0x0B)
`b BackSpace文字(0x08)
`a Bell文字(0x07)
`f 改ページ(0x0C)
`` `」自身。

コメント[編集]

行頭がセミコロンの行はコメント行。
コマンドのあとに半角スペースを空けてセミコロンがあれば、それ以降はコメント。
/* …… */で囲まれた範囲もコメントになる。

スクリプトの起動とAuto-executeセクション[編集]

スクリプトは読み込み時に解析され最適化される
文法エラーは読み込み時にチェックされ、修正されるまで実行できない。

スクリプトが読み込まれると、最初にReturnExitあるいはホットキーラベルが現れるか、スクリプトの終わりに達するまでが実行される。
この部分のことを、Auto-executeセクションと呼ぶ。

ホットキーラベルや#Persistent指令、Lock系キーの固定などで常駐状態にされない場合、Auto-executeセクションが終了したらスクリプトは終了する。

ホットキーカスタムメニューアイテムタイマーで起動されるスレッドでは、下記のコマンドでの設定はそれぞれ独立している。
これらの初期値は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コマンドで変数の内容をまとめて表示するという方法もある。
これらのデバッグは、アクティブウィンドウが変わってしまうと正常に動作しないようなところでは使用できないので注意が必要である。

また、ListLines, KeyHistory, OutputDebug といったコマンドもデバッグには有用である。

対話型デバッグ[編集]

AHKL AutoHotkey_L では DBGp クライアントを用いた対話型デバッグが可能である。これを利用すると以下のようなことができる。

  • ブレイクポイントの設置と撤去(ブレイクポイントに達するとスクリプトの実行は一時停止される)
  • スクリプトの行毎のステップ実行が可能(関数やサブルーチン自体、あるいはそれらをまたいでも可)
  • 全て、あるいは特定の変数の調査
  • 実行中のサブルーチンや関数のスタックを閲覧

スクリプト起動時のコマンドライン引数に /Debug を指定すると、自動的にデバッグクライアントに接続を行い、対話型のデバッグが可能となる。

AutoHotkey.exe /Debug[=SERVER:PORT] ...

Server および Port は省略可能である。以下の二つは等価である。

AutoHotkey /Debug "myscript.ahk"
AutoHotkey /Debug=localhost:9000 "myscript.ahk"

なおコンパイルしたスクリプトではこの機能は利用できない。

スクリプトのEXE化[編集]

ahk2exe.exeを使うことで、スクリプトを実行ファイル化することが可能。
実行ファイルはUPX圧縮される。
逆コンパイラも公開されているが、パスワードで暗号化すれば逆コンパイルを防げる。
作成した実行ファイルの配布は自由。

コンパイルされたスクリプトでは通常、タスクトレイメニューからメインウィンドウを表示することは出来ない。
Menu,TRAY,MainWindow」でメインウィンドウを表示可能にできる。

スクリプト側から、コンパイルされた状態で実行されているかどうかを知るには、「A_IsCompiled」変数を使用する。「1」ならコンパイルされている。

Ahk2exe.exeはコマンドラインから直接コンパイルを実行することも可能

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