ぺんちゃん日記

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

複数開かれている Chrome の中から必要なウインドウを探す【AutoHotkey】。

f:id:yasushiito:20190403184928p:plain

操作したい Chrome ウィンドウはどれ?

AutoHotkeyGoogle Chrome 操作すると何かと捗りますよね?
私は Chrome で表示されている AmazonYouTube のページに対してゴニョゴニョと操作することで楽させてもらっています。
AutoHotkey スクリプトから開いているウインドウを探して、ウィンドウタイトルの末尾が Google Chrome で終わるものを Chrome ウィンドウとして操作しています。
そこまでは良いですが、 Chrome は何枚でもウインドウを開けるので 見つけたウインドウが操作したいものである保証はないのが困ったところ。
そこで表示中の URL を取得して 操作したいウィンドウを探します。
ところが Chrome は何枚でもタブを開けるので見つけたウインドウが操作したい定時である保証はないのが困ったところ。
そこで Ctrl + tab でタブを順繰りに回しながら全てのタブで表示される URL を取得して操作したいウィンドウを探します。
これで確実に見つけることはできますが、開いているタブの枚数によってはとても遅い。
頻繁に使う機能では待っていられません。
もっと効率よく探すことはできないだろうか?

Chrome 拡張で解決する。

URL 取得系の chrome 拡張の中には 開いているタブ全ての URL をまとめて取得できるものがあります。
大抵は改行区切りでクリップボードに転送してくれるので、文字列検索で欲しいものがあるかないかだけでも判別できれば大幅に処理速度が改善します。
私は URL を取得する Chrome 拡張を二つインストールして、 一つは URL をまとめて取得できるもの、もう一つはカレントタブだけを取得するものと使い分けています。
これらはキーボードショートカットで起動できるようにしていますが、前者は ALT + SHIFT + C、 後者は ALT + C で割り当てています。
キーボードショートカット Ctrl の組み合わせを割り当てることもできますが、入力フォームで編集中の場合などに反応してくれないことがあるので、 ALT での組み合わせを推奨します。

ウィンドウの使い分け。

私は Chrome を2枚開いて使い分けています。
一つは Google documentを開いて音声入力するためのもので音声入力ウインドウと呼んでいます。
もう一つはブログを編集したりネットサーフィンするためのもので、作業用ウインドウと呼んでいます。
Autohotkey スクリプト側からは、 ウィンドウで開いているページの URL をまとめて取得して音声入力documentが開かれていれば音声入力ウィンドウと認識します。
また、 URL まとめて取得でGoogle ドライブのホームディレクトリを開いているウィンドウが見つかれば、それを作業用ウィンドウと認識します。
特定の URL を含んでいるかどうかで切り分けを行うので、ウィンドウの判別にはパラメータに特定の URL を渡す必要があります。
この URL は ini ファイルに保存されていて、その都度ロードして利用されます。

実際に使っているコードはこんな感じです。

カレントタブの URL を取得します。
Chrome だけでなく Firefox でも動作するように、どちらにブラウザの ALT +Cで取得します。

  
getbrowserurl(retfocus = False){
    ; キーボードショートカットでアドオンまたは Extension を呼び出して URL を取得する。
    ;調べたいブラウザを アクティブにしてから呼び出してください。
    ;
    ; Google Chrome ではURL をクリップボードにコピーで行う。
    ;https://chrome.google.com/webstore/detail/copy-url-to-clipboard/miancenhdlkbmjmhlginhaaepbdnlllc?hl=ja
    ;設定は ALT + C で選択中のタブのみをプレーンテキストでコピーするようにしておくこと。
    ;Firefox ではCopyTabTitleUrlアドオンを利用する。
    ;https://addons.mozilla.org/ja/firefox/addon/copytabtitleurl/
    ;ALT + C で URL のみをクリップボードにコピーできるように設定しておく。
    
    ;Chrome の設定ページなどChrome 拡張がコピペしてくれない URL があるので警告メッセージを設定しておく。
    Clipboard := "URL の取得に失敗しました。"
    Send,!c
    ;複数タブの URL をコピーできるタイプのエクステンションは改行コードを含むことがあるので削除しておく。
    Clipboard := RegExReplace(Clipboard, "\n", "")
    Clipboard := RegExReplace(Clipboard, "\r", "")
    return Clipboard
}

myahk/getbrowserurl.ahk at master · yasushiito/myahk · GitHub

作業用ウィンドウの探索です。
ウィンドウ見つけたらグローバル変数に保存して、以降の無駄な処理をスキップできるようにしています。
こちらは Chrome 専用です。
ALT + SHIFT + C で全てのタブの URL をまとめて取得します。

; Google Chrome で開かれた作業用ウインドウを URL で探す。
;第1パラメータで与えられた URL を開いているのが作業用ウィンドウである。
detectwork(url){
    global work
    IfWinExist, ahk_id %work%
        Return work
    work := 0
    ;念のためクリップボードをバックアップしておく。
    cb := Clipboard
    ;全てのウィンドウを調べる。
    WinGet, windows, list
    loop ,%windows%
    {
        ;ウィンドウタイトルの末尾を調べて Chrome だけに対して処理を行う。
        idstr := "ahk_id " . windows%A_Index%
        WinGetTitle,title,%idstr%
        pos := RegExMatch(title,"- Google Chrome$")
        if pos > 0
        {
            WinGet,wid,ID,%idstr%
            ;Chrome をアクティブにしてキーボードショートカットから URL を取得する。
            WinActivate,ahk_id %wid%
            ;Chrome Extension Copy all URLs を起動して ウィンドウで開いているすべてのタブの URL を取得する。
            Send, !+c
            ;作業ウィンドウを特定付ける URL が含まれてイルカ調べる。
            StringGetPos, pos, Clipboard, %url%
            if ErrorLevel = 0
            {
                work := wid
                Break
            }
        }
    }
    ;クリップボードにバックアップを返す。
    Clipboard := cb
    Return work

myahk/detectwork.ahk at master · yasushiito/myahk · GitHub

音声入力ウィンドウ探索です。
こちらも全く同様の作りですね。
いじってるグローバル変数が違うだけ。

; Google Chrome で開かれた音声入力エディタを URL で探す。
;第1パラメータで与えられた URL を開いているのが音声エディタのウィンドウである。
detecteditor(url){
    global editor
    IfWinExist, ahk_id %editor%
        Return editor
    editor := 0
    ;念のためクリップボードをバックアップしておく。
    cb := Clipboard
    WinGet, windows, list
    ;全てのウィンドウを調べる。
    loop ,%windows%
    {
        idstr := "ahk_id " . windows%A_Index%
        ;ウィンドウタイトルの末尾を調べて Chrome だけに対して処理を行う。
        WinGetTitle,title,%idstr%
        pos := RegExMatch(title,"- Google Chrome$")
        if pos > 0
        {
            WinGet,wid,ID,%idstr%
            ;Chrome をアクティブにしてキーボードショートカットから URL を取得する。
            WinActivate,ahk_id %wid%
            ;Chrome Extension Copy all URLs を起動して ウィンドウで開いているすべてのタブの URL を取得する。
            Send, !+c
            ;作業ウインドウを特定付ける URL を開いているWindows であれば作業用ウィンドウとする。
            StringGetPos, pos, Clipboard, %url%
            if ErrorLevel = 0
            {
                editor := wid
                Break
            }
        }
    }
    ;クリップボードにバックアップを返す。
    Clipboard := cb
    return editor
}

myahk/detecteditor.ahk at master · yasushiito/myahk · GitHub

ini ファイルの読み込みです。

これまでに試してみたこと。

URL バーからコピペする。
yasushiito.hatenablog.com

Chrome 拡張探して使う。
yasushiito.hatenablog.com