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!