当サイトはアフィリエイトプログラムによる収益を得ています。

Moonlight用に仮想モニターを作る|物理4枚と仮想1枚をBATで切り替えてみた

01-moonlight-vdd-switching

外出先からMoonlightで自宅のWindows PCを使うため、Virtual Driver Control(VDD Control)を入れ、普段の物理4枚と外出用の仮想1枚をMultiMonitorTool経由のBATで切り替える環境を作ってみた。

仮想1枚へ切り替えるところまでは比較的スムーズだったが、問題は物理4枚への復帰。モニターの指定方法・Primary・CFGを読み込む順番でかなりハマった。

最終的には2本のBATで正常に切り替えられ、スタートから呼び出せる状態まで仕上がった。根本原因は未特定だが、今はこの方法で常用できている。

スポンサーリンク

作れた切り替え環境

02-monitor-switching-states

状態

使用するモニター

切り替え方法

通常時

物理モニター4枚

4KをPrimaryにして使用

外出時

仮想モニター1枚

仮想モードBAT

利用後

物理モニター4枚

4枚復帰BAT

Primaryは、Windowsでメインとして扱うモニターのこと。通常時は4K物理モニターをPrimaryにしている。

外出するときは仮想モニターを有効化してPrimaryへ変更し、物理4枚をまとめて無効化する。Moonlightから使う画面は仮想2560×1600だけになる。

戻すときは物理4枚を有効化し、4KをPrimaryへ戻してからモニター配置を復元。最後に仮想モニターを無効化する流れだ。

今回の到達点
原因を完全に解明したわけではない。今回のPCで安定して切り替えられた順番をBATへ固定し、実用上使える状態にした。

仮想モニターを準備

03-vdd-virtual-display-setup

仮想モニターにはVirtual Driver Control(VDD Control)を使った。

導入直後は800×600で認識されることがあった。VDD ControlのXML Editorで不要な解像度を削除し、MacBook Airで使う用に2560×1600・60Hzで使える状態にした。

仮想モニターのShort Monitor IDはMTT1337だった。これはモニターを表す短い識別名で、後ほど仮想モニターを無効化するときにも使う。

この状態でSunshine+Moonlightから仮想2560×1600を表示できた。

仮想モードBAT

外出用へ切り替えるときは、次のBATを使っている。

@echo off

REM MultiMonitorTool
set MMT="C:\USERS\ROOT\APP\multimonitortool-x64\MultiMonitorTool.exe"

REM Full Monitor ID
set VERTICAL1="MONITOR\PHLC154\{4d36e96e-e325-11ce-bfc1-08002be10318}\0000"
set VERTICAL2="MONITOR\PHLC154\{4d36e96e-e325-11ce-bfc1-08002be10318}\0005"
set QHD="MONITOR\PHLC337\{4d36e96e-e325-11ce-bfc1-08002be10318}\0004"
set VDD="MONITOR\MTT1337\{4d36e96e-e325-11ce-bfc1-08002be10318}\0002"
set MAIN4K="MONITOR\PHL08E1\{4d36e96e-e325-11ce-bfc1-08002be10318}\0006"

REM 1. 仮想モニターをON
%MMT% /enable %VDD%

REM 認識待ち
timeout /t 2 /nobreak > nul

REM 2. 仮想モニターをPrimaryにする
%MMT% /SetPrimary %VDD%

REM Primary切替待ち
timeout /t 2 /nobreak > nul

REM 3. 物理モニター4枚を一括でOFF
%MMT% /disable %VERTICAL1% %VERTICAL2% %QHD% %MAIN4K%

exit

そのままコピーはできない
MultiMonitorToolの保存場所・Monitor IDは俺の環境の値になっている。自分の環境で確認して置き換える必要がある。

処理する順番

BATの流れは次のとおり。

1.仮想モニターを有効化
2.2秒待機
3.仮想モニターをPrimaryに変更
4.2秒待機
5.物理モニター4枚を一括で無効化

先に仮想モニターを有効化し、Primaryへ切り替えてから物理4枚を消している。

物理モニターを1台ずつ無効化すると、そのたびにWindowsのディスプレイ再構成が走る。そこで最終版では、4枚を1回の/disableでまとめて処理する形に変えた。

IDは自分の環境に合わせる

最初はShort Monitor IDへ統一しようとしたが、縦モニター2台がどちらもPHLC154になっていた。

06-multimonitortool-monitor-id-list

同じIDでは個別指定できないため、仮想モード側はモニターを個別に識別する長いFull Monitor IDを採用した。

4枚復帰でハマった

07-monitor-restore-stuck

試した方法

今回の結果

最終版での扱い

Full Monitor IDで物理4枚を戻す

後続処理が効かない場合あり

不採用

/SetMonitorsで4枚構成を復元

物理4枚が復帰せず

不採用

DISPLAY1DISPLAY4を一括で有効化

物理4枚は安定して復帰

最終版で採用

仮想モードではFull Monitor IDが使えたため、復帰側も同じ方式へそろえようとした。ところが物理4枚を戻した後、Primary変更や仮想モニターの無効化などが効かない場合があった。

MultiMonitorToolの「Copy /SetMonitors Command」で正常な4枚構成を取得し、/SetMonitorsも試したが、こちらも物理4枚は復帰しなかった。

原因は未特定だが、以前の復帰BATでは物理4枚そのものは安定して戻せていた。そこで指定方法の統一をやめ、動いていたDISPLAY1DISPLAY4の一括有効化へ戻した。

4枚復帰BAT

08-restore-four-monitors

最終的に正常復帰できたBATはこれだ。

@echo off

REM MultiMonitorTool の場所
set MMT="C:\USERS\ROOT\APP\multimonitortool-x64\MultiMonitorTool.exe"

REM 5枚構成CFGの場所(英数字名)
set CFG="C:\USERS\ROOT\APP\multimonitortool-x64\5mon.cfg"

REM 1. 物理モニター4枚を一気にON
%MMT% /enable "\\.\DISPLAY1" "\\.\DISPLAY2" "\\.\DISPLAY3" "\\.\DISPLAY4"

REM 物理モニターの認識・再構成を待つ
timeout /t 5 /nobreak > nul

REM 2. DISPLAY4をPrimaryにする
%MMT% /SetPrimary "\\.\DISPLAY4"

REM Primary変更後の再構成を待つ
timeout /t 2 /nobreak > nul

REM 3. 以前の成功BATと同じ書き方で5mon.cfgを読み込む
%MMT% /LoadConfig %CFG%

REM 4. 最後に仮想5をOFF
%MMT% /disable MTT1337

exit

CFGは、MultiMonitorToolで保存したモニター配置設定のこと。今回使っているのは、物理4枚と仮想1枚を含む構成を保存した5mon.cfgだ。

Primaryを先に戻す

復帰側で重要だったのは、CFGを読み込むタイミングだった。

1.DISPLAY1DISPLAY4を一括で有効化
2.5秒待機
3.DISPLAY4をPrimaryに変更
4.2秒待機
5.5mon.cfgを読み込み
6.MTT1337を指定して仮想モニターを無効化

俺の環境ではDISPLAY4が4K物理モニターになっている。4KがPrimaryではない状態でCFGを読んでも、配置は正常に戻らなかった。

CFGを先に読むのではなく、物理4枚を認識させてから4KをPrimaryへ戻し、その後にCFGを読む。この順番で物理4枚の通常配置まで復帰できた。

DISPLAY番号は環境依存
検証中に4KやVDDのDISPLAY番号が変わることもあった。DISPLAY4を固定値としてまねせず、自分の環境で対象モニターを確認した方がいい。

CFGは英数字名にした

最初は5枚.cfgという日本語名を使っていた。Primaryの変更までは成功するのに、/LoadConfigが効かなかった。

そこで同じCFGを5mon.cfgへ変更したところ、読み込みに成功。物理4枚の配置復元から仮想モニターの無効化まで、すべて通るようになった。

最終的に使った5mon.cfgと2本のBATは、同じフォルダに置いている。

09-multimonitortool-final-files

画面内の5枚.cfgやコピー版は検証途中の旧ファイルで、成功手順に使うのは5mon.cfg

以前にも4枚.cfgから4mon.cfgへ変えたときに同じような結果が出ている。ただし、日本語名が使えない仕様だと確認できたわけではない。

あくまで今回の環境では、日本語名で読み込めず、英数字名へ変えると成功したという実測になる。

スタートから起動

10-start-menu-bat-shortcut

2本のBATが動いても、毎回エクスプローラーやWindows検索から探すのは面倒だった。

Windows 11ではBATファイルをそのままスタートへ固定できなかった。そこでBATのショートカットを作り、Win + Rshell:programsを開いて、そのショートカットをスタートメニュー用のフォルダへ配置した。


あとはスタートから「仮想モード」「4枚復帰」と検索すれば、そのまま起動できる。

手順は次のとおり。

1.「仮想モード.bat」と「4枚復帰.bat」のショートカットを作る
2.必要ならショートカット名を「仮想モード」「4枚復帰」へ変更する
3.Win + Rを押す
4.shell:programsと入力して開く
5.作成した2つのショートカットを、開いたフォルダへ移動する
6.スタートを開き、「仮想モード」または「4枚復帰」と検索して起動する

普段の使い分け

11-home-away-monitor-use

自宅のAndroidタブレットから接続するときは、通常どおり物理モニターを表示する。Sunshineも普段見る物理モニターの表示IDへ戻している。

12-sunshine-display-id-setting

Sunshine側の設定。表示したいモニタを設定できる。

外出時だけスタートから「仮想モード」を実行し、物理4枚を消して仮想2560×1600をMoonlightから利用。終わったら「4枚復帰」を実行して元へ戻す。

音声はSteam Streaming Speakersを有効化している。Moonlightの「ストリーミング中にホストPCのスピーカーをミュートする」は、使う端末に合わせて切り替えている。

13-moonlight-speaker-mute-setting

現在の運用
自宅は物理モニター・外出時は仮想モニター。切り替え後の状態に合わせ、スタートに置いた2本のBATを使い分けている。

復帰BATはDISPLAY番号に依存し、根本原因も未特定。Monitor IDの指定方法も統一できていない。

それでも、物理4枚ON→4KをPrimary→英数字名のCFG読込→VDD OFFという順番なら正常に戻せた。BATを作って終わりではなく、スタートから呼び出せるところまで整えたことで、今は普段使いできる状態になっている。

使用したソフトウェア

今回の環境で使用したソフトウェアは以下の4つ。

コメント