【連載】AutoHotkeyの変数・関数・その他コマンドを理解する

AutoHotkey④

【連載】AutoHotkeyの変数・関数・その他コマンドを理解する

スズキ

AHKを活用するために欠かせない機能である、変数や関数の概要を解説します。

前回の記事 の続きです。

AutoHotkey徹底解説の第4回ということで、今回は変数や関数などについて解説します。

ただのホットキー設定用ソフトとして使うのか、スクリプト言語として扱えるのかを分ける部分ですので、軽く触れるようにはなっておくと便利です。

今回のゴール

変数や関数の基礎を知る。

はじめに

基本的には、AutoHotkey公式ドキュメントに沿った内容にしています。

具体的なサンプルコードを読み解く方式で学ぶ方が楽しいとは思いますが、超基礎的な部分は先にざっと知っておくと後で役に立つので、今回は完全に座学回としています。

次回以降は、サンプルコードの解説をする形式にしていきますので、今回はざっと通しで見ていただければと思います。

Variables and Expressions
https://www.autohotkey.com/docs/Variables.htm

Functions
https://www.autohotkey.com/docs/Functions.htm

変数

変数の基本

変数は次のように定義・利用します。

num := 123
str := "文字列は囲む"
num_copied := num

メッセージボックスで変数の中身を確認してみます。

MsgBox, % num_copied

; 出力結果
  ; 123

MsgBoxは、メッセージボックスを表示する機能です。
スクリプトを書く際に、変数の中身が想定しているものであるか確認するなど、デバッグ目的で使用されることが多いです。

第2回でVSCodeの設定をしたので、変数の確認などにはデバッガを利用できます。
デバッガを利用すると開発がスムーズに進みますが、上級者向けなので説明は割愛します。

なお、変数を空にしたい場合は、次のようにして空の文字列を代入します。

var := ""

長い文字列を格納した変数については、必要なくなったタイミングで空にしておくことをおすすめします。
最近では気にする必要もなくなりつつありますが、メモリも有限の資源です。

組み込み変数

AHKに元々用意されている変数です。よく使うものをピックアップしました。

変数説明
A_WorkingDir作業ディレクトリ。SetWorkingDirで設定する(前回参照)。
A_ScriptDir実行中のスクリプトが配置されているディレクトリのフルパス。
A_ThisHotkey最後に実行されたホットキー。例: ^z(Ctrl+Z)
ClipboardAllクリップボードの内容を格納している。
ErrorLevelコマンドの実行結果について格納される。If (ErrorLevel==1)などと利用されることが多い。

その他多数存在するため、こんなものがあると助かると思うことがあれば、確認してみるとよいでしょう。

Variables and Expressions #BuiltIn
https://www.autohotkey.com/docs/Variables.htm#BuiltIn

このセクションでは、変数を扱うための構文を解説します。

式というと、例えば次のような表現です。

If (price<=100 && color=="blue") {
  MsgBox, それは"買い"です。
}

条件分岐や繰り返し、その他関数などを活用する場合に、必要となる構文です。


利用可能な演算子は次のとおりです。

演算子説明
+ - * /加減乗除
+= -= *= /=加減乗除して代入
< <=未満・以下
==等しい
!=等しくない
&&かつ(論理積)
||または(論理和)
.文字列の結合。前後に半角スペースが必要。

式の結果を保存する

次のようにして、変数に計算結果を代入します。

price := 100
net_price := price * (1 - discount/100)

式評価をする(真偽値)

真偽値の扱いは、次のとおりです。

  • FALSE: 空白または0
  • TRUE: 空白または0以外の全て

例えば、次のような結果になります。

If (TRUE) {
  MsgBox, OK1
}

If (1) {
  MsgBox, OK2
}

If (3==3) {
  MsgBox, OK3
}

If (0) {
  ; 0はFALSEであるため実行されない
  MsgBox, OK4
}

If (2<1) {
  ; 2<1→0と解釈され、実行されない
  MsgBox, OK5
}

これらを盛り込んだサンプルコードを以下に用意しました。

price := 100
price += 50

If (price >= 130 && price < 150) {
  discount := 10
} Else {
  discount := 20
}

net_price := price * (1 - discount/100)

MsgBox, % "net_price = " . net_price

; 出力結果
  ; net_price = 120.000000
  ; (桁数などは必要に応じて`Format()`などで指定します。)

以上が、基本的な変数の扱い方になります。

このノリで関数を利用し、様々な処理を実現していきます。

関数

関数は、スクリプトの肥大化を防いだり、繰り返しの処理をテンプレ化したりする目的で利用されます。

自作の関数を利用する

例えば、2つの数を足して、10倍して2を引く処理を関数化したい場合は次のように設定します。


num1 := 10
num2 := 15

MsgBox, % my_calc(num1, num2)

my_calc(a, b) {
  result := (a + b) * 10 - 2
  Return result
}

; 出力結果
  ; 248

my_calc1015を渡して、計算結果のresultReturnで返します。
すると、my_calc(num1, num2)resultの値として扱われ、248が出力されます。

用意された関数を利用する

予め、どのような関数が存在するのかを把握しておく必要があります。
何かをしたいときに、確かそんなものもあった気がする、と思える必要があるためです。

以下、よく使う関数をピックアップしました。

関数説明
GetKeyState()指定したキーの押下状態を取得する。Ifと組み合わせることで、「xxを押していればxxをする」といった処理が可能になる。AHKを利用する上で避けて通れない超重要関数
WinActive()指定したウィンドウがアクティブかを判定する。
WinExist()指定したウィンドウが存在するかを判定する。
StrReplace()文字列を置換する。
SubStr()文字列の一部を抽出する。
DllCall()Windows APIを利用できる。無限の可能性を秘めている。

その他の関数やコマンドは以下で確認できます。

commands
https://www.autohotkey.com/docs/commands/

コマンド

関数以外にも便利な文法が存在しますので、最後にこちらを確認しておきます。

コマンド説明
ClipWaitクリップボードが更新されるまで待機する。クリップボードを利用する処理で用いる。
GoSub指定したラベルまで処理のフォーカスを移動し、Returnにあたったら戻ってくる。
GotoGoSubと似ているが、Returnにあたったら処理を終了する。
Hotkey動的にホットキーを定義する。
KeyWait特定のキーを押すまで、または離すまで処理を中断する。
MouseClickマウスクリックを送信する。
MouseGetPosマウスカーソルの座標を取得する。
MsgBoxメッセージボックスを表示する。スクリプトのデバッグによく用いられる。
Run外部プログラムを実行する。AutoHotkeyで実装できない処理も間接的に実行することができる。無限の可能性を秘めている
SetTimer指定した間隔で指定ラベルの処理を実行する。超重要コマンド
Sleep指定した時間だけ処理を停止する。
SoundBeepビープ音を鳴らす。条件分岐などが適切に設定できているか、デバッグ目的で用いられることがある。
ToolTipツールチップを表示する。
WinActivate指定したウィンドウをアクティブ化する。
WinClose指定したウィンドウを閉じる。
WinGetウィンドウに関する様々な情報を取得する。
#Ifホットキーの動作条件を限定する場合などに活用する。頻出コマンド
#Include分割したスクリプトファイルを読み込む。

その他の関数やコマンドは以下で確認できます。

commands
https://www.autohotkey.com/docs/commands/

まとめ

今回は前回に引き続き、基本的な文法をまとめました。

紹介できていない部分は山のようにありますが、残りの部分はケーススタディ的に知っていくのがよいだろうと思いますので、次回以降は実際のコードを解説する形式で進めていきます。