[chrome拡張機能]TabFinderをバッチから起動する

まえおき

前回の記事「chrome拡張機能:タブを検索する(TabFinder)」でブラウザ上でコマンドを入力してタブを切り替える拡張機能を作成した。

ただし、しかし、だとしても、今現在ブラウザを操作しているとも限らない。

ブラウザが、エクセルとpower pointとメモ帳とVS Codeの裏側に隠れているかもしれない。

Alt + Tabで画面を切り替えればいいとな?Alt + Tabで表示される10個程度のウィンドウからブラウザを探すのが苦痛に感じる人種もいるんです。

ということで、思考停止してブラウザを前面にしつつタブも切り替えるということをやっていく

 

 

できること

  1. Win + Rで「ファイル名を指定して実行」を立ち上げる。
  2. 適当な1文字 + コマンド名を入力してEnter。
  3. ブラウザを前面に出しつつ、タブも切り替えていく。(knはkintoneの略としている)

 

 

ソースコード

a.bat


REM バッチファイルのディレクトリへ移動する
cd %~dp0

REM power shellを起動する
REM -WindowStyle Hidden : ウィンドウを非表示にする
REM -ExecutionPolicy    : セキュリティレベル:ローカルで作成したスクリプトは実行できる
REM %*                  : バッチに渡された全ての引数をpsに渡す
powershell -WindowStyle Hidden -ExecutionPolicy RemoteSigned -File "../ps1/test.ps1" %*

 

入力速度を最優先にするため、バッチのファイル名は1文字にしている。

このバッチファイルが格納されているフォルダを環境変数に通して「a」だけ入力してこのバッチが起動するようにする。

Power Shellを触るのが今回が初めてなのでコメントをたくさんつけているのは許してほしい。

 

 

test.ps1

# 文字列型の引数を1つ受け取る
param(
    [string]$keyword
)

# VBのアセンブリ(.dll)をimportする
# dllはC:\Windows\Microsoft.NET\assemblyから選択する
add-type -AssemblyName microsoft.VisualBasic
add-type -AssemblyName System.Windows.Forms

# 引数が空文字である場合、処理を中断する
if ([string]::IsNullOrEmpty($keyword)) {
    Write-Output "タブ名を指定してください"
    exit
}

# 全プロセスから、Edgeのプロセスのみ取得する
# Get-Process            : 全てのプロセス情報を取得する
# Where-Object           : jsでいうところの.filter()
# {}                     : 条件式の記述
# $_.Name                : 各オブジェクトのNameプロパティを参照する
# -eq "msedge"           : "msedge"と完全一致しているか
# MainWindowHandle -ne 0 : 0(ウィンドウを持たないバックグラウンドプロセス)は無視する。
#                        : 0以外のプロセスが1画面につき1つのみ
$browser = Get-Process | Where-Object {$_.ProcessName -eq "msedge" -and $_.MainWindowHandle -ne 0}
Write-Output $browser

if (-not $browser) {
    Write-Output "Chromeが起動していません"
    exit
}    

# ブラウザを最前面にする
[Microsoft.VisualBasic.Interaction]::AppActivate($browser[0].Id);

# 拡張機能をショートカットで起動する
[System.Windows.Forms.SendKeys]::SendWait("^{g}")
# 待機時間を150msより短くするとキーワードの送信がうまくいかない
Start-Sleep -Milliseconds 150

# キーワードを送信
[System.Windows.Forms.SendKeys]::SendWait($keyword)
Start-Sleep -Milliseconds 10

# Enterを送信
# 全角の場合、変換を確定させるため、2度Enterを送信している
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")

 

こちらもコメントをたくさんつけているが、実際の行数は10行程度である。

流れとしては以下の処理を行っている

  1. param($keyword)でバッチから引数を1つ受け取る。(a knknの部分)
  2. Get-Processでedge かつ ウィンドウを持つプロセスのみ取得する
    (edgeだけでなく、各プロセスには画面を持たないバックグラウンドプロセスがある)
  3. SendWait("^{g}")でedgeに「Ctrl + g」のショートカットキーを送信する
  4. Start-Sleep -Milliseconds 150で150ms待機する。(待機しないと次のコマンドが一部しか送信されないため)
    十数回調整し、100msではコマンドの送信ミスが多発してしまうことを確認している。
  5. SendWait($keyword)でコマンド(kn)をブラウザに送信する
  6. 最後にSendWait("{ENTER}")enterを送信し、chrome拡張機能TabFinderのpopup.jsを発火し、タブ検索を行う