今回はAutoHotKeyの中でもメジャーなコマンド、#IfWinActiveを取り上げます。
単純に無変換+Eに「Shift+Ctrl+T」を割り当てたとしましょう。すると、他のどのプログラムでもこのショートカットキーは「Shift+Ctrl+T」にしかなりません。
これだと押しやすいショートカットキーはすぐに埋まってしまうし、またプログラムによって違う動作を割り当てることもできません。
この記事では#IfWinActiveを利用して、これらの問題を解決します。
#IfWinActiveの仕様
#IfWinActive [, WinTitle, WinText]
;もし指定したウインドウがアクティブなら、以下の処理を行う
引数
#IfWinActiveは最大2つの引数を取ります。
| 仮引数名 | 何が入るか |
|---|---|
| WinTitle | タイトル or ウインドウクラス or プロセス名 or プロセスID or ウインドウグループ |
| WinText | ウインドウのタイトルで絞り込む場合、そのタイトルに含まれる文字 (省略可) |
ここでは特に使用頻度が高い1つ目の引数、WinTitleの「タイトル」、「ウインドウクラス」、「プロセス名」、「プロセスID」が一体何を指すのかを押さえておきましょう。
例えばGoogle Chromeで「ahk」と検索した場合、それぞれの値は表のようになります。
| 名称 | 意味 | 値 (Chromeの例) |
|---|---|---|
| タイトル | ウインドウのタイトルバーの文字 | ahk – Google 検索 – Google Chrome |
| ウインドウクラス | ウインドウのクラス名 | ahk_class Chrome_WidgetWin_1 |
| プロセス名 | プログラムのexeファイルの名前 | ahk_exe chrome.exe |
| プロセスID | ウインドウごとの個別ID | ahk_pid 5524 |
記述例
この値をそのまま「#IfWinActive」の後に入れましょう。出来上がりはこんな感じ。
#IfWinActive,ahk_exe chrome.exe ;Chrome.exeがアクティブな時にだけ
vk1D & E:: ;無変換キー+Eで
Send,^+b ;ブックマークバーの表示/非表示を切り替える
Return
#IfWinActive
最後の「#IfWinActive」でこの条件の終わりを示します。この記述が無いと、後に続くコードは全てChrome.exeがアクティブな時にしか働かなくなってしまうので、ここも注意です。
値を調べる – Window Spyの簡単な使い方
ではこの「ウインドウクラス」や「プロセス名」はどうやって調べればよいでしょうか?
ここでは最も簡単な方法として「Window Spy」をご紹介します。タスクバーのAutoHotKeyアイコンを右クリック→「Window Spy」を選択しましょう。

起動すると下のような画面が現れます。今は画面の1番上の部分に注目してください。

試しにメモ帳を起動してそのウインドウをクリックすると、

クリックしたウインドウに関する情報が表示されました。これを1行丸ごとコピペするだけでウインドウを指定することができます。
ウインドウクラスやプロセスIDの注意点
この中で「ウインドウクラス」と「プロセスID」は、このアプリケーションがアクティブな時という指定には向いていません。なぜならプロセスIDは起動する度に値が変化し、ウインドウクラスは異なるアプリケーションでも同じ場合があるからです。
ウインドウクラスの例としてWebブラウザのGoogle Chromeと、マークダウンエディタのTyporaで比較してみましょう。

左がChrome、右がTyporaです。全く別のアプリケーションですが、TyporaはChromeのレンダリングエンジンを使って描写するため、ウインドウクラスが同じになっています。
ウインドウクラスが同じであることを把握できている場合はかまいませんが、基本的に「アプリケーション別に機能を設定したい」という場合は、プロセス名(exeファイルの名前)を基準にすることをオススメします。
#IfWinActiveとIf WinActive()
そうでなければどうする?
「もし指定したウインドウがアクティブなら、以下の処理を行う」のが#IfWinActiveコマンドですが、そうでなければ何も起こりません。
もしそうでなかった場合の処理を記述するのであればIf WinActive()を使用します。例を見てみましょう。
vk1D & E:: ;無変換+Eを押した時、
If WinActive("ahk_exe chrome.exe"){ ;Chromeがアクティブであれば
WinMinimize,A ;アクティブなウインドウを最小化する
}else If WinActive("ahk_exe NOTEPAD.EXE"){ ;そうでなくてメモ帳がアクティブなら
Send,おはようございます。 ;おはようございます。と出力
}else{ ;そうでなければ
WinActivate,ahk_exe chrome.exe ;Chromeをアクティブにして、
WinMaximize,A ;アクティブなウインドウを最大化する
}
return
if WinActive()は条件文
の無い「If WinActive()」は条件文です。条件文はIf 〇〇で始め、〇〇の結果によって処理を分岐させます。
書き方は上記のようにIf WinActive()と丸括弧を使い、引数をダブルクオート""で囲むか、IfWinActive,で引数を続けるかの選択肢があります。どちらか好きな方を選んでください。(個人的には前者の方が馴染みやすくて好みです)
条件文はその処理内容を記述するのに波括弧{}を必要とします。{}の中に処理内容を記述しましょう。またIfWinActive,で始める場合、波括弧は次の行に記述しなければエラーになります。
IfWinActive,ahk_exe chrome.exe
{...} ;OK
IfWinActive,ahk_exe chrome.exe{
...} ;NG
else Ifとelse
else Ifで「そうでなくて〇〇がアクティブなら」を表します。このelse Ifは不要であれば省略可能。
最終的な「そうでなければ」を示すのはelseです。こちらも他の2つと同じように、処理を波括弧内に記述します。
今回のコードはあくまで一例ですが、メモ帳やChromeでどんな動作になるか試してみてください。

