晴耕雨読

working in the fields on fine days and reading books on rainy days

AHKプログラミングでつまづきやすい点

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

評価順は次の通りです。

  1. MsgBox % %var2% … 変数var2が展開されて、var1になります
  2. MsgBox % var1 … 変数var1が展開されて、123になります
  3. MsgBox 123

2回変数展開ができるということは、変数名を動的に変更することができたり、配列もどきを作ることができます。 %演算子は変数展開だけじゃないよ、という話でした。

おわりに

AHKの基本構文で躓きやすい点はこんなところだと思います。 基本構文で困ったときはAutoHotkeyの公式ドキュメント(Scripting Language)を読みましょう。 日本語のサイトだと、細かい仕様まで書かれていないことが多いので、一度目を通しておくと良いかと思います。 それでは Happy Coding!