AutoHotkeyのチュートリアルを読んだ

以下訳とメモの混ざったもの.

スクリプトの作成

スクリプトはプレーンテキストで,AutoHotkeyのプログラム(AutoHotkey.exe)によって実行される.スクリプトは通常ホットキー,もしくはホットストリングを含むが,そのいずれも含まない場合スクリプトは起動した瞬間にファイルの先頭から順に実行される.
AutoHotkeyの作成例を示す.

  1. AutoHotkeyをダウンロード&インストール(AutoHotkey Downloads)
  2. 右クリックメニューから新規作成->AutoHotkey Script
  3. 作成したファイルを右クリック->Edit Script
  4. 空行を追加し,次のように記入.
#space::Run www.google.com

ここで#はウィンドウズキー("ミ田"みたいな形の例のヤツ)を示しており,#spaceはウィンドウズキーを押したままスペースを打鍵するという意味である.::は左側のホットキー(今回はWin+Space)が押されたときに実行すべきコマンドを指定する.今回の場合はGoogleが標準のブラウザで開く.
スクリプトを実行する手順は次の通りである.

  1. スクリプトファイルを保存して閉じる.
  2. ファイルをダブルクリックする.タスクバーの通知領域にアイコンが表示される.
  3. Win+Space(今回指定したホットキー)を入力すると,デフォルトのブラウザでGoogleが開く.
  4. スクリプトを終了,編集したいときは通知領域のアイコンを右クリックしてメニューを表示する

そのほかの注意点:

  • 複数のスクリプトを同時に起動可能で,通知領域にはスクリプトごとにアイコンが作成される
  • 一つのスクリプトに複数のホットキー,ホットストリングを含むことができる
  • PCへのログオンと同時に起動したければ,スクリプトへのショートカットをスタートメニューフォルダに追加する

プログラムやドキュメントを開く

Runコマンドによりプログラム,ドキュメント,URL,ショートカットを開くことができる.記述例を示す.

Run Notepad
Run C:\My Documents\Address List.doc
Run C:\My Documents\My Shortcut.lnk
Run www.yahoo.com
Run mailto:someone@somedomain.com

これらのコマンドはホットキーラベルを用いてホットキーに割り当てることができる.以下に例を示す.

#n::Run Notepad
^!c::Run calc.exe

一つ目はWin+n,二つ目はCtrl+Alt+cに割り当てている.
複数行にわたるコマンドをホットキーに割り当てることもできる.この場合,コマンドはホットキー定義の次の行から記述し,定義が終了したらreturnを記述する必要がある.

#n::
  Run http://www.google.com
  Run Notepad.exe
return

もしプログラムへのPATHが通っていなければ,プログラムへのフルパスを記述する.

Run %A_ProgramFiles%\Winamp\Winamp.exe

ここで%A_ProgramFiles%と記述したのは組み込み変数の一種で(一覧:Variables and Expressions - Definition & Usage | AutoHotkey),この場合はC:\Program Filesと記述する代わりに使用可能である.このような組み込み変数を利用すれば,より可搬性の高いスクリプトを作ることができるだろう.また,相対パスを使用することもできる.その場合,基準のディレクトリは%A_WorkingDir%で参照できるディレクトリとなる.このディレクトリはSetWorkingDirコマンドにより変更可能である.
Runの代わりにRunWaitを使用した場合,プログラムが起動している間スクリプトの実行がストップする.プログラムが終了した時に次の行へ進む.

RunWait Notepad
MsgBox メモ帳を終了しました.

上記の例では,スクリプトにより起動されたメモ帳が閉じられた時点でMsgBoxコマンドが実行されメッセージボックスが出現する.
そのほかの注意点:

  • コマンドや変数名は大文字小文字を区別しない.Runはrunと記述でき,%A_ProgramFiles%は%a_programfiles%と記述可能である

キーストローク,マウスクリックの送信

アクティブ(最前列)になっているウィンドウへキーストロークを送信するにはSendコマンドを用いる.

^!k::
Send Sincerely,{Enter}Katsudon
return

上記の例で言うと,{Enter}を除けば({Enter}はエンターキー)文字通りのキーストロークが送信される(日本語や対応するキーがない場合は{ASC nnnnn}を使うhttp://lukewarm.s101.xrea.com/commands/Send.html#asc).また,{Enter}以外にも各種の特殊キーが使用可能である.一覧はhttp://lukewarm.s101.xrea.com/commands/Send.html参照のこと.
また,キーストロークの送信は特定の文字列をタイプした際にも発生させられる.これはホットストリングと呼ぶ.

::btw::by the way

上記の例ではコンマやスペースに続いてBtwとタイプされた場合に"By the way"と展開される(see also http://lukewarm.s101.xrea.com/Hotstrings.html).
マウスクリックの送信にあたってはX,Y座標の指定が必要である.マウスクリックを含むスクリプトを作成する場合はAutoScriptWriterやWindow Spy(いずれもAutoHotkeyに付属している)を使うのが簡単である.以下にWindow Spyを使う場合を紹介する.

  1. Window Spyを起動する
  2. 目的のウィンドウをアクティブにする(Window Spyは常にトップに表示される)
  3. マウスカーソルを目的の位置に移動する
  4. Window Spyに表示されているMouse Positionを読み取る
  5. Clickコマンドと組み合わせてクリックを発生させる.
Click 112, 223

上記の例ではX座標112, y座標223の位置で左クリックをする.このとき,CoordModeで変更していなければ座標はアクティブウィンドウ内での相対値として認識される.

ウィンドウの操作

ウィンドウをアクティブにするにはWinActivateを使用する.ウィンドウが存在しているかどうかを検出するにはIfWinExistまたはWinWaitを使用する.IfWinExistはウィンドウの有無による条件分岐を発生させ,WinWaitはウィンドウが存在するようになるまでスクリプトを停止する.以下に使用例を示す.

IfWinExist Untitled - Notepad
{
  WinActivate
}
else
{
  Run Notepad
  WinWait Untitled - Notepad
  WinActivate
}

例では"Untitled - Notepad"をタイトルに含む(ここでは大文字小文字は区別される)ウィンドウが存在すればそれをアクティブにし,存在しなければNotepadを起動,起動が完了するのを待ってそれをアクティブにする.また,ここではlast found windowという仕組みを同時に利用している.これはIfWinExistなどで検出されたウィンドウを保持する仕組みで,WinActivateなどがウィンドウの指定なしに実行された場合は保持されているlast found windowが利用される.
他によく利用されるウィンドウ関連のコマンドには以下のようなものがある.

  • IfWinActive: 指定したウィンドウがアクティブかどうかにより条件分岐
  • WinWaitActive: 指定したウィンドウがアクティブになるまで待機
  • WinClose: 指定したウィンドウを閉じる
  • WinMove: 指定したウィンドウを移動(または|かつ)リサイズ.
  • WinMinimize, WinMaximize, WinRestore: 指定したウィンドウを最大or最小化,もしくはリストア(最大or最小化の解除).

MsgBox,InputBoxなどを利用した入力の取得

MsgBoxはダイアログを表示するだけではなく様々なボタンを表示し,どのボタンを選択したかを取得することができる.直近のMsgBoxでどのボタンが押されたのかの情報を利用して条件分岐するのにはIfMsgBoxが利用される.以下はYes/Noの二択のボタンを表示させ,押されたボタンにより条件分岐をさせる例である.

MsgBox,4,,続けますか?
IfMsgBox,No
  return
;; No以外
MsgBox あなたはYesを押しました.

MsgBoxの引数の指定法などはhttp://lukewarm.s101.xrea.com/commands/MsgBox.htmlを参照.
もしファイルやフォルダのパスをGuiで選択し取得するようなコマンドを作成したいならFileSelectFileやFileSelectFolderが役に立つだろう.
また,上記例にも見られるように一部の例外を除けばコマンド直後のカンマは省略することができる.

MsgBox これは正しい書き方
MsgBox,これも正しい書き方

変数とクリップボードの利用

スクリプト中において変数にはテキストまたは数値を代入できる.もし変数が数字,または数字と小数点しか含まない場合,変数は数値と認識されて各種数学演算や比較ができる.
関数中で定義されたローカル変数を除けば全ての変数はグローバルであり,スクリプト中のどこからでも参照,変更が可能である.また,変数宣言は必要なく,使用されたときに存在するようになる.
代入には=を使用する.

変数1 = 123
変数2 = かつどん食べたい

変数の比較,参照の例を示す

if 変数2 = かつどん食べたい
{
  MsgBox 変数2は"かつどん食べたい"という文字列を含んでいます.
}
if 変数1 >= 100
{
  MsgBox 変数1は%変数1%を含んでおり,値は100以上です.
}

例に示したとおり,変数名をパーセント記号で囲うことで中身を参照できる.同様の手法は変数の中身をコピーする際にも使用できる.

結合した変数 = %変数1% %変数2%

また,変数同士を比較する場合は以下の形式がよく使われる.

if(ほげ > ふが)
{
  MsgBox ほげは%ほげ%を含み,ふがは%ふが%を含み,ほげはふがより大きい
}

ここでifに括弧が付いているが,これによりif文の条件式は式であると見なされる.式中での変数参照では%で囲う必要がない.もし括弧なしで同じことをしたいなら,「if ほげ > %ふが%」のように後者の変数を%で囲う必要がある.また,その場合比較演算子は一つしか使えない.
なお,式中で%を使った変数参照を行った場合,その変数名が指す変数に格納されている文字列が展開された上で変数名と見なされ,文字列が指す変数が参照される.
また,代入には=ではなく:=を使うこともできる.この場合右辺に式を記述することができ,左辺には計算結果が代入される.
Clipboard変数はWindowsクリップボード中に含まれるテキストを指す専用の変数である.%clipboard%はクリップボード内の参照をするだけでなく,代入することでクリップボード内を変更することもできる.また,\nなどのエスケープシークエンスは`nなどとして`を使って記入することができる.

繰り返し処理

loopは指定した回数だけ続く処理を繰り返す.

Loop 3
{
  MsgBox 三回出るよ!
}

loopには変数を指定することもできる.スクリプトの別の場所で繰り返し回数を管理するのに便利である.Sleepと組み合わせれば,一定時間ごとに特定のプログラムを走らせることもできる.

Loop %RunCount%
{
  Run C:\example.exe
  Sleep 600000 ;600000ms = 60sec
}

なお,上記の例において%RunCount%が0の場合ループは一度も実行されずにスクリプトの次の処理へ移る.
loopはbreakによって抜けることもできる.また,もしloopに数値をしていしなかったらbreak,またはreturnで終了しない限り繰り返しは終了しない.以下はF1キーを押している間マウスの左クリックを繰り返すスクリプトの例である.

$F1::
Loop
{
  if not GetKeyState("F1", "P")
    break
  Click
}
return

GetKyeState関数は第一引数のキーの押し下げ状態を判断する関数で,キーが押し下げられていれば1,そうでなければ0が返る.第二引数がPならばプログラムの生成する仮想的な押し下げ状態ではなく,物理的な押し下げ状態を判断する.もしTならば各種のロックキー(CapsLock etc.)のトグル状態を取得できる.F1の頭についた$記号はホットキーイベントを再帰的に呼び出すことを防止する働きがある.今回はGetKeyState関数中でF1キーを使用するために必要.
また,Whileを使用するとより簡潔に記述することができる.Whileに与えられた値が1である限り括弧内の処理が繰り返される.

$F1::
while GetKeyState("F1", "P")
{
  Click
}
return

このほかに,テキストファイルを1行ずつ読み込んで繰り返し処理をするLoop,READ,パターンに一致するファイル/フォルダについて繰り返し処理をするLoop(files),テキストを指定の区切り文字で分割して繰り返し処理をするLoop,PARSE,指定キー以下のレジストリキーに対して繰り返し処理を行うLoop(registry)がある.

ファイルとフォルダの取り扱い

ファイルの最後にテキストを追加したい(もしくは新しいファイルを作成したい)場合はFileAppendを使用する.

FileAppend,A line of text to append.`n,C:\My Documents\MyTextFile.txt

ファイルを削除するにはFileDeleteを使用する.

FileDelete,C:\MyDocuments\MyTextFile.txt