ぺんちゃん日記

食と歴史と IT と。 Web の旅人ぺんじろうが好奇心赴くままに彷徨います 。

【AutoHotkey】複数起動している Google Chrome の中から特定のウィンドウを探す。

Google ChromeGoogle documentを開いて音声入力で文字を入力しています。

yasushiito.hatenablog.com

ブラウザは様々なページを開くのでタブを切り替えながら閲覧と入力を繰り返しているのです。
AutoHotkeyを利用してポーズキーを入力すると Google Chrome から音声入力タブを探してマイクを聞き取りモードにするところまではできています。
このスクリプトでだいぶ楽になりましたが、音声入力用のを別のウィンドウで開いた方が、さらに作業が楽になるんじゃないかと思いました。
しかし、 Google Chrome 複数起動するとなると、 タブ切り替えで探す処理では見つけ出すことができません。
そこで 開いているすべての Chrome のウィンドウを調べて判定する処理を書きます。
出来上がったスクリプトはこちら。

pause::
    editor := 0
    work := 0
    WinGet, windows, list
    loop ,%windows%
    {
        idstr := "ahk_id " . windows%A_Index%
        WinGetTitle,title,%idstr%
        pos := RegExMatch(title,"- Google Chrome$")
        if pos > 0
        {
            pos := RegExMatch(title,"音声入力用")
            if pos > 0
            {
                WinGet,editor,ID,%idstr%
            }
            else
            {
                WinGet,work,ID,%idstr%
            }
        }
    }

    If (editor <> 0) {
        WinActivate,ahk_id %editor%
        Sleep 500
        Send,+^s
    }

見つかったウインドウは変数editorに入ります。
ついでに閲覧用の Chrome のウィンドウを変数workに入れています 。

動作条件はあります。
探したいページ、今回は音声入力用documentのタブがカレントでなければなりません。
仮に開かれていても他のタブの後ろにある場合はこの処理では探し出せません。
探したいページが複数のウィンドウで開いている場合は選択されるウィンドウは不定です 。

ここからは力の許す限り解説します。

ウィンドウの検索は正規表現を使って判定します。
正規表現は難易度は高いものの複雑の算定ができるので便利です。
ahkwiki.net

今回はウィンドウのタイトルを使って判定します。
タイトルの一部に『- Google Chrome』を含む ウィンドウを探します。
ありふれたキーワードなので全く関係ないウィンドウも対象としないように、正確性を確保するために$をつけて Google Chrome が末尾で終わるものに限定しています。

複数のウィンドウを取り出す処理は WinGet を使います。
WinGetは第2パラメータのコマンドをリストモードにすると少し特殊な結果が得られます。

    WinGet, windows, list

上記のような場合、変数 Windows にはヒットしたウインドウの数が入ります。
さらに windows1 windows2 windows3のような名前の変数が作成されてウィンドウ ID が入ります。
ahkwiki.net

ループコマンドでヒットしたウィンドウの数だけ繰り返しつつ、 windows1のような文字列を作り出して、変数から ID をもらいます。
ahkwiki.net

1,2,3のような連番はループ中の変数A_Indexを参照します。
それを使って文字列をつなぎ合わせて windows1などを作り上げて ID を取得しています。