【AutoHotKey】複数ウィンドウを指定する3つの方法

2022年10月7日AutoHotkey

AutoHotkeyのアイコン

この記事では、キーに別の機能を割り当てられるソフト「AutoHotKey」で、複数ウィンドウを対象にする3つの方法について書きます。

GroupAdd、区切り線、正規表現です。

【AutoHotKey】複数ウィンドウを指定する3つの方法

AutoHotKeyの「#IfWinActive」や「#If」コマンドで、複数ウィンドウを対象にしたいと思ったことはありませんか?例えば、ChromeとEdgeで、F1キーを無効にしたい…などです。

僕は今まで、以下のように、1つずつ記述していました。短いコードならいいんですが、長文になればなるほど、管理がめんどくさくなります。

;Edge上でF1キーを無効化
#IfWinActive ahk_exe msedge.exe
  F1::Return
#IfWinActive

;Chrome上でF1キーを無効化
#IfWinActive ahk_exe chrome.exe
  F1::Return
#IfWinActive

インターネットで調べても、あまり日本語の記事がヒットしませんでした。そこで、当サイトの読者様からの情報提供も参考にして、色々調べてみました。結果、大きく3つの方法があることが判明しました。

同じように、AutoHotKeyで複数ウィンドウを指定したい方、参考にしてみてください。ちょっと難しいですが、どれか1つでも覚えたら、もっと便利にAutoHotKeyを使いこなせれると思います。

AutoHotKeyについては、以下の記事を参考にしてみてください。本記事は、既に導入して、ある程度使い方を知っている方向けです。

注意点

本記事は、AutoHotKey初心者が書いています。僕です。

3つ紹介しますが、それ以外にも、まだ方法があったり、もっと効率よい記述方法があると思います。AutoHotKeyベテランさんには、参考にならないと思います。

むしろ、僕の認識が間違っていて、あってはならないことですが、嘘を書いている可能性もあります。嘘がある場合は、お手数ですが、問い合わせよりご連絡いただければ幸いです。

AutoHotKeyの複数ウィンドウ指定方法

GroupAddでグループ作成

僕が、AutoHotKeyを使い始めて、最初に知った複数ウィンドウの指定方法です。これが、一番オーソドックスなんじゃないかと思います。この方法なら、日本語の記事もいくつかヒットしました。汎用性が高いので、覚えておいて損はありません。

正直、これだけ覚えておけば、他は覚えなくてもOKです。

「GroupAdd」というコマンドを使って、Aグループ、Bグループといったように、ウィンドウをグループ分けします。識別したい時は、作成したグループ名で呼び出す…という代物です。

以下の形になります。

;タイトルのマッチ方法(中間一致)
SetTitleMatchMode, 2
;GroupAddで、ウィンドウをじゃんじゃん登録する
GroupAdd, F1無効化, ahk_exe chrome.exe
GroupAdd, F1無効化, Edge
GroupAdd, F1無効化, Firefox
Return

;GroupAddに登録したグループ名で区別する
#IfWinActive, ahk_group F1無効化
  F1::Return
#IfWinActive

1つずつ分解して解説します。

ウィンドウタイトルのマッチ方法(SetTitleMatchMode, 2)

まず、基本のコードとして、「SetTitleMatchMode, 2」というのを先頭に書きます。これは、ウィンドウタイトルで指定するときに、中間一致で検索するという意味です。

SetTitleMatchMode, 1前方一致
SetTitleMatchMode, 2中間一致
SetTitleMatchMode, 3完全一致
SetTitleMatchMode, Regex正規表現

AHKファイルの一番先頭に書いておくおまじないコードと思っておけばOKです。既に書いている方は、書く必要はありません。複数書いても、最初に書いたほうが優先されて2つ目以降は動作しません。

「ウィンドウタイトルで指定」というのは、「ahk_exe Notepad.exe」ではなく、「メモ帳」といったように、ウィンドウ名の一部でウィンドウを識別する方法です。タイトルで指定しない場合は、別に書かなくてもOKです。

グループの作成(GroupAdd)

次に、「GroupAdd」でグループを作成します。以下の形で書きます。

GroupAdd, グループ名, グループに追加したいウィンドウ

最初に、「GroupAdd」、次に好きなグループ名、最後にウィンドウといった感じです。間は、「,」(カンマ)記号で区切ります。カンマの後に、半角空白を入れていますが、なくてもOKです。僕が見やすいから入れているだけです。

グループ名は、こだわりがない場合、アルファベットがおすすめです。「GroupAdd, F1無効化, Edge」といったように、日本語でも動作しますが、何かしら不具合が出る可能性もあるのでおすすめしません。

ウィンドウの指定方法は、AutoHotKey付属のツール「WindowSpy」で調べられます。使い方・起動方法が分からない方は、下記アコーディオンを参考にしてみてください。

適当にAutoHotKeyファイルを実行して、タスクトレイにあるアイコンを右クリック→「Window Spy」をクリックすると起動できます。

AutoHotKeyの右クリックメニュー

あるいは、エクスプローラーを開いて、AutoHotKeyのインストール場所を開きます。デフォルトでは以下の場所に保存されています。

C:\Program Files\AutoHotkey

AutoHotKeyフォルダー内の「WindowSpy.ahk」をダブルクリックします。これで同じように起動できます。

頻繁に使う方は、右クリック→「ショートカットの作成」で、デスクトップなどの好きな場所に配置しておくといいかもしれません。

「Window Spy」ウィンドウを起動できたら、名前を調べたいウィンドウをクリックします。

AutoHotKeyのWindowSpyを使う手順画像1

Window Spy内に、ウィンドウの情報が表示されます。重要なのは、上から数行です。

AutoHotKeyのWindowSpyを使う手順画像2

以下のような構成になっています。

新しいタブ – Google Chromeウィンドウタイトル
ahk_class Chrome_WidgetWin_1ウィンドウのクラス名
ahk_exe chrome.exeウィンドウのプロセス名
ahk_pid 23448ウィンドウのプロセスID名

基本的には、タイトル名、プロセス名の2つで、思い通りの動作にできると思います。

例えば、Chromeブラウザ上で、F1キーを無効化したい場合は、以下のようになります。Chromeだけ無効化して、Edgeなどでは無効にしません。

#If WinActive("ahk_exe chrome.exe")
F1::Return
#If

ウィンドウタイトルで指定する場合は、大文字と小文字をしっかり区別しましょう。タイトル名が「Chrome」になっている場合、「chrome」だと認識してくれません。

参考:【Chrome】F1の「Google Chrome ヘルプ」を無効化する方法

以下の感じで指定します。識別方法が違うだけで、全部Chromeを指しています。ウィンドウタイトルでも、クラス名でも、プロセス名でも認識してくれます。

;タイトルのマッチ方法(中間一致)
SetTitleMatchMode, 2

;ウィンドウタイトルで指定
GroupAdd, F1無効化, Chrome
;クラス名で指定
GroupAdd, F1無効化, ahk_class Chrome_WidgetWin_1
;プロセス名で指定
GroupAdd, F1無効化, ahk_exe chrome.exe
Return

タイトルとクラス名で指定する時の注意点は、アプリをまたいで認識してしまう可能性があるという点です。

例えば、タイトル名「GroupAdd,F1無効化,Chrome」で指定したとします。

この場合、Google Chromeブラウザが対象になりますが、一方で、「Chrome」がタイトルに入った記事を開いているFirefox、Edgeなども対象になってしまいます。

「GroupAdd,F1無効化,Chrome」で指定した場合
Google Chromeブラウザ対象
Edgeで「Chrome」とGoogle検索したページ対象
Edgeで「ナポリタン」とGoogle検索したページ対象外

クラス名も同じです。クラス名は、世界に1つだけではありません。

例えば、Chromeブラウザのクラス名は、「Chrome_WidgetWin_1」ですが、Edge、Vivaldiブラウザとも一緒です。ベースがChromiumで一緒なので、恐らくクラス名も一緒なんだと思います。

唯一、プロセス名(例:ahk_exe chrome.exe)だけが、アプリ1つずつに割り当てられています。

「Chromeブラウザだけに適用したつもりが、たまに別ブラウザでも反応しちゃう!」という方は、指定方法を見直してみましょう。

逆に、あえてアプリをまたぎたい時には、ウィンドウタイトル名が便利です。特に、サイトごとで動作を分けたい時に使えます。

「ahk_exe chrome.exe」で指定してしまうと、Chromeだけになってしまいますが、「Twitter」にすると、ブラウザに関係なく、タイトルにTwitterとあれば、動作するようになります。

;タイトルのマッチ方法(中間一致)
SetTitleMatchMode, 2

;Chromeを指定(Chromeブラウザだけ対象)
GroupAdd, グループ名, ahk_exe chrome.exe
;Twitterを指定(ブラウザは関係なし)
GroupAdd, グループ名, Twitter
Return

どうしても、プロセス名だとそのウィンドウ全体が対象になってしまうので、タブ(サイト)ごとで動作を分けたい時は、タイトル名が優秀です。YouTubeとTwitterのサイトで、使えるショートカットキーを分けるとかね。

グループは、いくらでも作成可能です。以下のように、Aグループ、Bグループとじゃんじゃん登録できます。途中で順番が入れ替わったりしてもOKです。

;タイトルのマッチ方法(中間一致)
SetTitleMatchMode, 2
;GroupAddで、ウィンドウをじゃんじゃん登録する
GroupAdd, naporitan, ahk_exe chrome.exe
GroupAdd, naporitan, Edge
GroupAdd, naporitan, Vivaldi
GroupAdd, sushi, Edge
GroupAdd, sushi, Firefox
GroupAdd, sushi, Floorp
Return

;グループ「naporitan」で、F1無効化
#IfWinActive, ahk_group naporitan
  F1::Return
#IfWinActive

;グループ「sushi」で、Windows+D無効化
#IfWinActive, ahk_group sushi
  #d::Return
#IfWinActive

注意点ですが、1行につき1グループです。初心者さんは、1行に全部収めて綺麗にしようと思わないようにしましょう。沼ります。長くなってもいいので、改行しましょう。

ダメな例を書いておきます。全部動作しません。

;こんな感じで1行にしようとしてはダメ!
;ダメな例1
GroupAdd, naporitan, ahk_exe chrome.exe GroupAdd, naporitan, Edge GroupAdd, naporitan, Vivaldi
;ダメな例2
GroupAdd, naporitan, ahk_exe chrome.exe || Edge || Vivaldi
;ダメな例3
GroupAdd, naporitan, ahk_exe chrome.exe&Edge&Vivaldi

グループの呼び出し、アクティブな時に発動(#IfWinActive)

最後に、「#IfWinActive」でグループ名を記述して、複数ウィンドウを対象にした動作を設定します。

SetTitleMatchMode, 2
GroupAdd, F1無効化, Chrome

;GroupAddに登録したグループ名を呼び出して、使いたい機能を書き込む
#IfWinActive, ahk_group F1無効化
  F1::Return
#IfWinActive

「#IfWinActive」は、特定のウィンドウがアクティブの時に発動するという意味です。上記コードの場合、「F1無効化」というグループに登録したウィンドウ上で、F1を無効化するという意味です。

「ahk_group」で、呼び出したいグループ名を指定します。

特大ポイント解説です。よく見たら、「GroupAdd」の時は、間を「,」(カンマ)で区切っていましたが、「ahk_group」で呼び出す時は、そのあとのグループ名との間に、カンマがありません。

呼び出す時、カンマは不要です。入れてしまうと、動作しなくなります。ここがつまづきポイントだと思うので、覚えておきましょう。「#IfWinActive」と「ahk_group」の間にはあります。

【ポイント】グループ名は、大文字小文字区別されない!

グループ名は、大文字小文字が区別されていません。例えば、「a」と「A」のグループ名を作成したとします。この場合、どちらかが正常に動作しません。どちらも同じ「エー」として認識されるからです。

他のグループ名と被らないように、1文字ではなく、数文字で作成するのがおすすめです。(例:naporitan、sushi)

「NAPORITAN」というグループ名を作成した場合、「#IfWinActive」で呼び出す時は「naporitan」でもOKということです。まぁ、普通に大文字小文字、統一したほうがいいと思います。

GroupAdd, B, ahk_exe msedge.exe
GroupAdd, A, ahk_exe chrome.exe
Return

;「b」と指定すると、「b」、あるいは「B」のグループが検出される
#IfWinActive, ahk_group b
  F1::#d
  Return
#IfWinActive

;「a」と指定すると、「a」、あるいは「A」のグループが検出される
#IfWinActive, ahk_group a
  F1::Return
#IfWinActive

【応用】複数ウィンドウを除外(#IfWinNotActive)

複数ウィンドウがアクティブじゃない時に発動させる…といったことも可能です。「#IfWinActive」ではなく、「#IfWinNotActive」を使います。

SetTitleMatchMode, 2
GroupAdd, naporitan, ahk_exe chrome.exe
GroupAdd, naporitan, ahk_exe msedge.exe
Return

;ChromeとEdgeがアクティブじゃない時に発動
#IfWinNotActive, ahk_group naporitan
  F1::Return
#IfWinActive

なにげに便利です。

僕は、以下の記事のように、AutoHotKeyを使って、数字を常に半角入力しています。この時、一部ソフトだと干渉して使えないので、グループ化で除外リストを作成しています。AとBとCのウィンドウ以外で発動する…といったことが可能です。

WinActiveで区切り線(バーティカルバー)

2番目に紹介するのは、「#If WinActive」と区切り線です。下記のように書きます。グループ化と違って、毎回書かないといけないという手間があります。こだわりがない方は、1つ目に紹介したグループ化でいいと思います。

;タイトルのマッチ方法(中間一致)
SetTitleMatchMode, 2

;Chrome、Edge、Vivaldiで、F1無効化
#If WinActive("ahk_exe chrome.exe") || WinActive("Edge") || WinActive("Vivaldi")
  F1::Return
#If

区切り線は、キーボードのBackSpaceの左側にあると思います。そのままだと円記号になるので、Shiftを押しながら入力します。半角です。

余談ですが、区切り線は、縦線、バーティカルバー、パイプともいうそうです。僕が適当に言ってるだけで、そもそも「区切り線」という名称なんて存在しないのかも(笑)

「WinActive(“〇〇")」の中に、登録したいウィンドウを記述します。ウィンドウタイトル名、プロセス名、どれでもOKです。

僕の環境で試してみたんですが、縦線は、2つじゃなくても動作しました。1つでもOKです。教えていただいた読者さんが2つにしていたので、本記事でも2つで紹介しています。半角空白は、あってもなくてもOKです。

;タイトルのマッチ方法(中間一致)
SetTitleMatchMode, 2

;区切り線(バーティカルバー)は、1つでもOK。半角空白はなくてもOK
#If WinActive("ahk_exe chrome.exe")|WinActive("Edge")|WinActive("Vivaldi")
  F1::Return
#If

縦線(バーティカルバー)で区切るのがポイントですね。以下、OKなパターンとダメなパターンを書いておきます。

;OKな書き方(上から、2本縦線、2本縦線半角空白、縦線、縦線半角空白)
#If WinActive("Chrome")||WinActive("Edge")
#If WinActive("Chrome") || WinActive("Edge")
#If WinActive("Chrome")|WinActive("Edge")
#If WinActive("Chrome") | WinActive("Edge")

;ダメな書き方(全部動作しません)
#If WinActive("Chrome || Edge")
#If WinActive("Chrome")||("Edge")
#If WinActive("Chrome),("Edge")
#If WinActive("Chrome , Edge")

正規表現で区切り線(バーティカルバー)

3番目に紹介するのは、正規表現を使ったウィンドウタイトルの部分一致です。以下のような形で書きます。

;タイトルのマッチ方法(正規表現)
SetTitleMatchMode, Regex

;縦線で区切りつつ、ウィンドウタイトル名で指定
#IfWinActive Chrome|Edge|Discord
  F1::Return
#IfWinActive

ウィンドウタイトルのマッチ方法(SetTitleMatchMode, Regex)

今まで紹介した方法は、「SetTitleMatchMode」を中間一致(2)にしていました。今回の方法は、正規表現(Regex)です。正規表現を使った、マッチ方法を使うよ~という意味です。

正規表現を語り始めると、キリがない…というか、僕は、ほぼ理解していない初心者なので、語ろうにも語れません(笑)

区切り線で、複数ウィンドウ指定

「#IfWinActive」の後に、半角空白をあけて、ウィンドウタイトル名をずらずら書いていきます。

ポイントですが、正規表現の場合、区切り線(バーティカルバー)は、1本だけです。2本だと動作しません。正規表現における区切り線1本が、「どれかに該当する」という意味です。Excelでいう「OR」条件ですね。

また、ウィンドウタイトル名での指定になります。「ahk_exe chrome.exe」や「ahk_class Chrome_WidgetWin_1」といったクラス、プロセス名では動作しません。

;ダメな例(クラス名、プロセス名では指定できない)
#IfWinActive ahk_exe chrome.exe|ahk_exe msedge.exe
  F1::Return
#IfWinActive

何かしらの方法がありそうな気はしています。正規表現にした途端、ウィンドウタイトル名でしか指定できないってのは、なんか違和感です。

僕の環境で色々試してみましたが、どれも不発でした。エラーは出ないけど、動作しなかったです。

試したこと結果
#IfWinActive 'ahk_exe chrome.exe’ | 'ahk_exe msedge.exe’動作しない
#IfWinActive “ahk_exe chrome.exe" | “ahk_exe msedge.exe]動作しない
#IfWinActive [ahk_exe chrome.exe] | [ahk_exe msedge.exe]動作するけど、最初のウィンドウ(Chrome)だけ反応。Edgeは動作しなかった

カクカッコでいい感じに、クラス・プロセス名として認識してくれるかと思っていましたが、ダメでした。

調べると、正規表現におけるカクカッコは、「いずれか1つに該当する」という意味だそうです。プロセス名として認識しているように見えて、実は単純に「ahk_exe chrome.exe」という文字列のどれかにヒットするウィンドウタイトル名を探しているのですね。きっと。

【応用】GroupAddにも正規表現が使える

正規表現を使うことで、GroupAddを1行化できます。ただし、おすすめしません。ウィンドウタイトル名だけの指定になってしまうのもデメリットです。

;タイトルのマッチ方法(正規表現)
SetTitleMatchMode, Regex
;縦線で区切りつつ、ウィンドウタイトル名を記述する
GroupAdd, F1無効化, Chrome|Edge

#IfWinActive, ahk_group F1無効化
  F1::Return
#IfWinActive

正規表現(Regex)は、AutoHotKey熟練者向けです。初心者さんは、使わないほうが沼りにくいです。(失敗しにくい)

感想

以上、AutoHotKeyで複数ウィンドウを指定する3つの方法でした。

皆さんは、どれが一番しっくりきましたか?僕は、グループ化(GroupAdd)です。

それにしても、AutoHotKeyは、調べると調べるだけ、奥が深いなぁと感心です。効率化を目指して、AutoHotKeyを使うんだけど、コードの作成に時間を取られすぎて、本末転倒みたいな感じです笑。どんな言語にせよ、プログラマーって、すごいですね。尊敬しかありません。

Posted by ナポリタン寿司