AHKのスクリプトを書いているときに個人的に躓いていた点を3つ紹介します。 「代入演算子」、「Ifの条件文」、「%演算子」についてです。
2種類の代入演算子
AHKには :=
と =
の2種類の代入演算子があります。
:=
は右辺の式を評価した値を変数に格納するものです。一方で、=
は右辺を文字列として扱い、ダブルクオートで囲ったものを変数に格納します。
一般的なプログラミング言語の代入と同じものが :=
代入演算子です。以下はプログラム例です。
MyNumber := 123
MyString := "This is a pen." ; 文字列はダブルクオートで囲む
Var2 := Var ; 識別子は変数として扱われる
次に、右辺を文字列として評価する =
代入演算子のプログラム例です。
MyNumber = 123
MyString = This is a pen. ; 文字列をダブルクオートで囲む必要なし
Var2 = %Var% ; %演算子で変数の展開が必要
代入演算子の :=
と =
は右辺の評価方法が異なるのに、どちらも似ている記号なので、個人的には気を付けていてもすぐ書き間違えてしまうところです。
Ifの条件文
AHKの公式ドキュメントには、Ifの条件文は括弧()
で囲わなくてもよいと書かれています 1。
普通にAHKを使う分には問題ないのですが、特殊なケースでは括弧()
を付けないと期待通りに動かない例があります。
例えば、以下の例は期待通りに動きません。
var1 := 1
var2 := 2
If var2 > var1
MsgBox ok ; なぜか実行されない
正しく動かすためには条件文に括弧を付ける必要があります。
var1 := 1
var2 := 2
If (var2 > var1) ; 括弧で囲むと
MsgBox ok ; 実行される
公式ドキュメントのIf文についてさらに詳しく調べると2、If文は条件文を見て、内部的に従来のIf文(legacy If statements)を呼び出す場合があります。
具体的には、Ifの条件文で =
, <>
, !=
, >
, >=
, <
, <=
, between
, in
, contains
, is
の演算子を使っているときは IfEqual, IfLess などの従来のIfが使われ、場合によっては期待通りの動作をしないときがあります(トレードオフでその代わりに実行速度が速いと思われる)。
回避策としては、If文の条件文は常に括弧()
で囲むことで、従来のIf文は呼び出されなくなり、期待通りに動くようになります。迷ったら括弧で囲いましょう。
さらに、AHKのIfの条件文は括弧で囲うことで and
などの論理演算子も使えるようになるので、条件文には括弧を付けることをおすすめします。
%演算子
%
は変数展開をするためのものだけではありません。
式を評価した値を関数の引数に渡すときにも使えます 3。
後者として使う場合は % 評価したい式
と書きます。
例えば、現在のマウス座標からX方向に+50、Y方向に+50移動するプログラムは以下の通りです。
MouseGetPos MouseX, MouseY
MouseMove % MouseX + 50, % MouseY + 50
文字列の結合も%
演算子でできます。
FilePath = sample.png
MsgBox % A_ScriptDir "\" FilePath
ここからが本題で、%
演算子の中で、変数展開の%var%
を使うことができます。
例えば、以下のコードを実行すると 123 が表示されます。
var1 := 123
var2 := "var1"
MsgBox % %var2% ; => 123
評価順は次の通りです。
-
MsgBox % %var2%
… 変数var2が展開されて、var1になります -
MsgBox % var1
… 変数var1が展開されて、123になります MsgBox 123
2回変数展開ができるということは、変数名を動的に変更することができたり、配列もどきを作ることができます。 %演算子は変数展開だけじゃないよ、という話でした。
おわりに
AHKの基本構文で躓きやすい点はこんなところだと思います。 基本構文で困ったときはAutoHotkeyの公式ドキュメント(Scripting Language)を読みましょう。 日本語のサイトだと、細かい仕様まで書かれていないことが多いので、一度目を通しておくと良いかと思います。 それでは Happy Coding!