🍳

AutoHotKeyで「デフォルトブラウザ」を操作する

2022/01/02に公開

AutoHotKeyでブラウザ操作をすることがある。
この際、ウィンドウ指定をするわけだが、デフォルトブラウザを変更するたびにこれをいちいち書き換えるのは面倒くさい
「デフォルトブラウザ」の情報自体はどこかに存在しているはずなのだから、それを読み出して利用することはできないのか?

デフォルトブラウザを取得する

このバッチファイルを改変して利用させていただいた。
また、改変にあたって下記を参考にした。

@ECHO OFF

SETLOCAL ENABLEDELAYEDEXPANSION

SET /A ISEDGE=0
SET EXPR="^[-%%].*"
SET /A PT=0

FOR /F "USEBACKQ TOKENS=3 DELIMS= " %%i IN (`REG QUERY HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\Shell\Associations\URLAssociations\http\UserChoice /V ProgId`) DO (
  SET PROGID=%%i
)

FOR /F "USEBACKQ TOKENS=3-8 DELIMS= " %%i IN (`REG QUERY HKEY_CLASSES_ROOT\!PROGID!\Shell\Open\Command /VE`) DO (

  ECHO %%~j | FINDSTR /R %EXPR% >NUL
  IF NOT ERRORLEVEL 1 (
    SET BROWSER=%%i
    GOTO EXECUTE
  ) 

  ECHO %%~k | FINDSTR /R %EXPR% >NUL
  IF NOT ERRORLEVEL 1 (
    SET BROWSER=%%i %%j
    GOTO EXECUTE
  ) 

  ECHO %%~l | FINDSTR /R %EXPR% >NUL
  IF NOT ERRORLEVEL 1 (
    SET BROWSER=%%i %%j %%k
    GOTO EXECUTE
  ) 

  ECHO %%~m | FINDSTR /R %EXPR% >NUL
  IF NOT ERRORLEVEL 1 (
    SET BROWSER=%%i %%j %%k %%l
    GOTO EXECUTE
  ) 

  ECHO %%~n | FINDSTR /R %EXPR% >NUL
  IF NOT ERRORLEVEL 1 (
    SET BROWSER=%%i %%j %%k %%l %%m
    GOTO EXECUTE
  ) 

  SET BROWSER=%%i %%j %%k %%l %%m %%n
)

:EXECUTE
@ECHO ON
set /p X=!BROWSER!<NUL

普通にECHOすると改行が入って後で面倒なので、改行抜きで出力しておく。

バッチファイルの出力をAutoHotKeyで受け取る

AutoHotKeyそのものには、スクリプト内で実行したバッチファイルの標準出力を受け取るような機能はない。
ファイルに書き込んで読み出せばいいのだが、それはいかにも格好悪い。

そこで、またまた先人の知恵を拝借する。

このStdoutToVar_CreateProcess()を関数ライブラリに放り込んで利用させていただいた。

デフォルトブラウザ名を変数に格納し、利用する

sOutput := StdotToVar_CreateProcess("DefaultBrowser.bat") ; バッチファイルでデフォルトブラウザの実行ファイルのパスを取得する
StringReplace, sOutput, sOutput, ", , all ; パスを格納した変数から両端の二重引用符を削除
SplitPath, sOutput , OutFileName ; ファイル名のみを取り出す
global default_browser := "ahk_exe " . OutFileName

ここでちょっとだけ苦労することになった。
バッチファイルの標準出力を格納した変数はリテラルな二重引用符を含んでいたので、これを削除しなければならない。
しかし、二重引用符のエスケープ方法がわからない。

↑を見て""だの""だの""""だの、% Chr(0s22)だのと色々試したがまったくうまくいかず。
ブチ切れてエスケープ一切なしの二重引用符一個放り込んだらそれが正解だった。通る意味がわからん。ちなみに`"でも通ったので、こっちの方が精神衛生上は好ましいかもしれない。

(追記)
StrReplace()関数を使えば良いと教えてもらった。なるほど。
AutoHotKeyには同名同機能のコマンドと関数が多く存在するが、関数の方が後から追加されたものなので、スマートに処理できる事が多い。

というわけでこうなった

sOutput := StrReplace(StdoutToVar_CreateProcess("DefaultBrowser.bat"), """")
SplitPath, sOutput , OutFileName ; ファイル名のみを取り出す
global default_browser := "ahk_exe " . OutFileName

Discussion