Chromeの挙動

Google Calendarをアプリ的に使おうかなと思って,例のショートカット切り出しみたいな機能を使って,Google Calendarをコマンドラインからさくっと立ち上がるようにしてみた.

ところが,コマンドラインからGoogle Calendarを呼び出すと,当然1つウインドウが立ち上がるので,呼び出すたびにGoogle Calendarが増えちゃう.こういうときは,古くさいやり方だけど,バッチファイルを書いて,立ち上がってるGoogle Calendarがあったら落として,それから立ち上げる,みたいにしようとた.例えば,TASKKILL /fi “WINDOWTITLE eq Google カレンダー*”chrome_proxy.exe –app-id=***みたいな.

で,TASKKILLして立ち上がってる他のChromeが落ちたらいやなので,TASKLISTで調べてみたらちゃんといくつもChrome.exeがあって,上記TASKKILLコマンドでGoogleカレンダーのウインドウだけ消える.ところが,Googleカレンダーを2つ立ち上げた状態で,TASKLISTを見てみると1つしかこのタスクがない.実際,上記TASKKILLをしても1つしかGoogleカレンダーが落ちない.1つKILLしたあとで,TASKLISTを見てみるとGoogleカレンダーのタスクがまだ残ってて,もう一度TASKKILLをすると2つめが落ちる.

Chromeのタブやウインドウごとのプロセス割り当てってどうなってるんだろ.普通だとTASKLISTに2つ見えるか,もしプロセスが共通だとしてもTASKKILLで両方消えると思うんだけど.

———– 追記

ちょっとわかってきた.Chromeのプロセスはタブや切り出したアプリごとに存在しているが,そのプロセスにはウインドウ名の情報とかが入ってない.で,Chromeの代表PIDみたいなのがあって,それにはChromeの中で一番前面にあるものの情報が入ってる.だから,普通のChromeブラウザがあがっていて,Googleカレンダーきりだしウインドウもあがっている場合,もし”Google カレンダー”というウインドウタイトルでプロセスの検索をかけたばあい,Chromeの中で一番最前面なのがGoogle カレンダーだった場合だけPIDがヒットして,それをTASKKILLするとなぜかChrome全体ではなくそのGoogle カレンダーが閉じる.Chromeブラウザが前面だった場合,そのブラウザの表示しているページのタイトルがそのPIDのウインドウ名になってて,TASKKILLするとブラウザ全体が閉じる.各タブや切り出したアプリそれぞれにはPIDが割り当てられているけど,そのPIDを強制的にTASKKILLしてもウインドウは消えずにウインドウ内の表示だけ消える.ということは,結論としては今のやり方だとChromeブラウザがはしっているときは基本上手くいかないということだ.うーん,どうすればいいんだろ.

———– さらに追記

いいかげん長いが,続き.

TaskkillやTasklistコマンドの挙動は上記のようにイマイチよくわかんないんだけど,プログラムからウインドウを列挙してウインドウタイトルを調べるとどうもいけるっぽい.ナゾ.

というわけで,なにで書いてもいいんだけど,最近よく使っているAutoHotKeyのスクリプトで

WinGet, windowlist, list
loop ,%windowlist%
{
  idstr := "ahk_id " . windowlist%A_Index%
  WinGetTitle,title,%idstr%
  if InStr(title,"Google カレンダー") > 0
  WinClose, %idstr%
}

みたいに書いて,なんとか望む動作が得られた.