![見出し画像](https://assets.st-note.com/production/uploads/images/131845885/rectangle_large_type_2_db8bacc388547c38e6688f0489c9d794.png?width=1200)
WSL2でマルチディスプレイの接続/切断をCLIで行う
たまには、生成AI以外も書いてみようかしらん。
外部ディスプレイに接続してしまっているRTX 4090 Laptop GPU(16GB)からディスプレイを切断するのが、毎回とても面倒であったのがモチベーションです。
1. 操作が面倒くさい
Windowsマシンにおいて、ディスプレイを接続/切断するとき、システム>ディスプレイを選択して、接続/切断を切り替える必要があります。
![](https://assets.st-note.com/img/1708697037153-ey0e6uk4wG.png?width=1200)
これがとても面倒くさい。コマンドラインからできるようにしましょうよ?と思いますよね、ね、ね。
2. MultiMonitorTool
自分でアプリを作るのも一興ですが、世界中の誰かさんがきっと同じことを既に考えているだろうということで、いまは生成の時代ではありますが検索します。
はい、すぐに見つかりました。
MultiMonitorTool は、複数のモニターの操作に関連するいくつかのアクションを実行できるようにする小さなツールです。 MultiMonitorTool を使用すると、モニターの無効化/有効化、プライマリ モニターの設定、すべてのモニターの構成の保存とロード、およびあるモニターから別のモニターへのウィンドウの移動を行うことができます。
これはとても強力なツールです。ありがたや。
私が実現したいことは、以下のようにできそうです。
MultiMonitorTool.exe /enable <モニタ識別子>
MultiMonitorTool.exe /disable <モニタ識別子>
ダウンロード
リンク「Download MultiMonitorTool for x64 systems」から、zipファイルをダウンロードします。
適当な場所にファイルを配置します。
![](https://assets.st-note.com/img/1708697376668-Y4HEF6voBH.png?width=1200)
Monitor IDのメモ
MultiMonitorTool.exeを起動します。
PCに繋いでいるディスプレイが上段に表示され、下段はそのディスプレイで表示されているアプリ(ウインドウ)がリストされています。
![](https://assets.st-note.com/img/1708697557682-MMqwa9AM9h.png?width=1200)
ディスプレイを右クリックしてプロパティを開きます。
![](https://assets.st-note.com/img/1708697651967-7gTd4FCgNU.png)
プロパティの一つ「Monitor ID」の値をコピーし、メモしておきます。このメモをディスプレイごとに実施しておきます。
![](https://assets.st-note.com/img/1708697852233-H34QZ24nGz.png?width=1200)
3. 接続/切断するScriptを書く
以下のようなscriptを書きました。PATHが通っているディレクトリ(~/bin など)に disp というファイル名で保存します。
#!/bin/bash
LANG=C
usage_exit() {
echo "Usage: $0 <dispaly_number> enable|disable" 1>&2
exit 1
}
# internal
MAIN_MONITOR_ID="MONITOR\BOE09F9\{4d36e96e-e325-11ce-bfc1-08002be10318}\0001"
# viewsonic
SUB1_MONITOR_ID="MONITOR\VSC1935\{4d36e96e-e325-11ce-bfc1-08002be10318}\0006" # HDMI
#SUB1_MONITOR_ID="MONITOR\VSC1935\{4d36e96e-e325-11ce-bfc1-08002be10318}\0007" # DisplayPort
# dell
SUB2_MONITOR_ID="MONITOR\DELA1CE\{4d36e96e-e325-11ce-bfc1-08002be10318}\0005"
#
# analyze options.
#
if [[ $# -ne 2 ]]; then
usage_exit
fi
case $1 in
1) MONITOR_ID=${MAIN_MONITOR_ID}
;;
2) MONITOR_ID=${SUB1_MONITOR_ID}
;;
3) MONITOR_ID=${SUB2_MONITOR_ID}
;;
*) usage_exit
;;
esac
ACTION=$2
if [[ ${ACTION} != "enable" && ${ACTION} != "disable" ]]; then
usage_exit
fi
/mnt/c/Program\ Files/multimonitortool-x64/MultiMonitorTool.exe /${ACTION} "${MONITOR_ID}"
MONITOR_IDの文字列は、先ほどメモしたMonitor IDの値です。このため、各自の環境に合わせて書き換えてください。
Windowsのディスプレイの識別番号と、このscript内の数字(1, 2, 3)は合わせておきましょう。合わせておかないと、間違いなく混乱します。
弊環境ではノートPCに外部ディスプレイを2つ繋げているため、計3つのディスプレイがあるため、1/2/3となっています。こちらも各自の環境に合わせて、増減させてください。
4. 試してみる
弊環境では、左から 2 > 1 > 3 の順番にディスプレイが並んでいます。
![](https://assets.st-note.com/img/1708699222265-jKdMwG6pRQ.png?width=1200)
MultiMonitorTool上、3台共にResolutionに値があります。
![](https://assets.st-note.com/img/1708699279672-d3rvGVnAPu.png)
ここで、2 を disable してましょう。
$ disp 2 disable
切断されました。
![](https://assets.st-note.com/img/1708699336074-Wdp8Jl1SwQ.png?width=1200)
![](https://assets.st-note.com/img/1708699141248-CA4AySznuL.png)
ディスプレイ 2 をenableしてみましょう。
disp 2 enable
接続されました。
![](https://assets.st-note.com/img/1708699414015-jXuY375ESC.png?width=1200)
![](https://assets.st-note.com/img/1708699382310-VVYqMUYdsb.png)
満足。