【Mac/Win】外部モニターの入力を「声」と「ボタン」で切り替える方法|SiriとStream Deck活用術

教えて

書斎のデスク環境を整える中で、MacとWindowsを行き来するたびに、モニタの裏側に手を伸ばしてジョイスティックを操作するのが億劫になってきました。 理想は、作業中に手を止めることなく「Macからは声で、Windowsからは手元のボタンで」スマートに切り替えること。

今回は、Mac(クラムシェル)+ DELL U3223QE という環境を例に、PC側からモニター入力を制御する構築記録を残します。

はじめに:あなたの運用スタイルはどっち?

この記事ではMacとWindows両方の設定方法を紹介していますが、両方とも設定する必要はありません。 お使いのメインマシンに合わせて、必要なパートだけ読んでください。

パターンA:Macをメインに使っている人

👉 「Mac編:Siriで音声操作」 の章へ進んでください。 HomePod mini(Siri)と連携し、声だけで入力切替ができるようになります。

パターンB:Windowsをメインに使っている人

👉 「Windows編:Stream Deckで物理操作」 の章へ進んでください。 WindowsにはSiriがありませんが、Stream Deckなどの物理ボタンでワンタッチ切り替えが可能になります。 (※AlexaとIFTTTを使えば音声操作も可能ですが、物理ボタンの方が圧倒的に手軽で安定しています)


検証環境とゴール

この方法は、DDC/CI(Display Data Channel Command Interface)に対応した多くの外部モニターで応用可能です。

  • 目的: 外部モニターの入力ソースをPC側からコマンドで切り替える。
  • 検証環境:
    • MacBook Pro (Apple Silicon) / Windows デスクトップ
    • モニタ: DELL U3223QE
      • ※LG、BenQ、EIZOなど、DDC/CI対応の他社モニターでも基本的な考え方は同じです。

【Mac編】Siriで音声操作を実現する

Macユーザーのゴールは、HomePod mini に向かって「Hey Siri, モニタ切り替え」と言うだけで画面が変わる環境です。

失敗談:BetterDisplay CLI は入力切替に向かない

まずはMac側の構築です。定番アプリ「BetterDisplay」のCLI機能(betterdisplaycli)を使えば簡単だろうと考えましたが……。

betterdisplaycli get -version
> Failed.

まさかの門前払い。 調べた結果、最新版ではセキュリティ(統合機能)が強化されており、CLIを使うには「操作したいパラメータ(Input Source)」をGUIで手動登録し、識別子を割り振る必要があるなど、設定が複雑すぎました。 たかだか「入力切り替え」のためにここまでするのはコストが見合わないため、断念しました。

解決策:Apple Silicon専用ツール「m1ddc」

気を取り直して、よりシンプルで低レイヤーなツールを探し、Apple Silicon (M1/M2/M3) 専用の軽量DDC制御ツール m1ddc を採用しました。

brew install m1ddc

モニターIDと入力ソース番号の特定

インストール後、入力切り替えコマンドを試したところ、あっさり動作しました。 DELL U3223QEにおける各端子のID(VCP値)も、総当たりで検証して特定しました。

  • 15: DisplayPort (Windows接続)
  • 25: Thunderbolt (Mac接続)

注意: この番号(15, 25等)はモニターのモデルによって異なります。 ご自身の環境で m1ddc display 1 get input を実行するか、総当たりで set input を試して確認してください。

Siriショートカット連携と「SSH経由」の壁

ツールは決まったので、あとはショートカットアプリに登録してSiriで呼ぶだけ……と思ったのですが、ここでも壁にぶち当たりました。

HomePodからシェルスクリプトが実行できない問題

iPhoneからテストすると動くのに、HomePodに向かって「Hey Siri」と言うとエラーになる。 原因は、「シェルスクリプトを実行」アクションが、HomePod上で動こうとして失敗していたことでした。

解決策: アクションを「SSH経由でスクリプトを実行」に変更しました。 「HomePod → SSH → Mac」という経路にすることで、確実にMac上でコマンドを走らせることができます。

事前準備:Macのリモートログイン許可

  1. 「システム設定」>「一般」>「共有」を開く。
  2. 「リモートログイン」をON にする。

【Mac編】完全版:コピペで使える入力切替スクリプト

私の環境(U3223QE)では、Macが見えていない(Windows表示中)状態でも、裏で繋がったThunderbolt経由で m1ddc get input が成功し、15 (Windows) が返ってくることが確認できました。

そのため、シンプルに「現在の値を見て逆にする」スクリプトを採用しました。

![Macと外部モニターの入力切替フロー]

パターンA:王道の「現状取得」ロジック(推奨)

DDC通信が優秀なモニター向けです。手動で切り替えた後でも必ず正しく動作します。 このスクリプトをショートカットアプリの「SSH経由でスクリプトを実行」に貼り付けます。

#!/bin/bash
# 1. SSH環境用にパスを全部通す(grep等が無いエラーを防ぐ)
export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/opt/homebrew/bin:$PATH

M1DDC="/opt/homebrew/bin/m1ddc"

# 2. 現在の状態を取得 (数字だけ抽出)
# 失敗してもスクリプトを止めないように || echo "" をつける
CURRENT_INPUT=$($M1DDC display 1 get input 2>/dev/null | grep -oE '[0-9]+$' || echo "")

# デバッグ用ログ(ショートカットの結果で確認可能)
echo "Detected Input: [$CURRENT_INPUT]"

# 3. 判定ロジック
if [ "$CURRENT_INPUT" = "15" ]; then
    # Win(15)なら -> Mac(25)へ
    $M1DDC display 1 set input 25
    echo "Switched to Mac (25)"

elif [ "$CURRENT_INPUT" = "110" ] || [ "$CURRENT_INPUT" = "25" ]; then
    # Mac(25/110)なら -> Win(15)へ
    $M1DDC display 1 set input 15
    echo "Switched to Windows (15)"

else
    # 【重要】値が空(取得失敗) or 想定外なら -> Mac(25)へ強制復帰
    # これが「NSString変換エラー」の最大の特効薬です
    echo "Unknown status or Error. Forcing Mac (25)"
    $M1DDC display 1 set input 25
fi

# 4. 最後に必ず正常終了コードを返す
exit 0

(※zsh/bash互換性のため、比較演算子は == ではなく = を使用しています)

パターンB:ファイル管理ロジック(フォールバック用)

もしお使いのモニターが、「入力切り替え後にDDC通信がタイムアウトする」「値が返ってこない」という挙動をする場合は、こちらの「ファイルで状態を覚える」方式を使ってください。

#!/bin/bash
M1DDC="/opt/homebrew/bin/m1ddc"
STATE_FILE="/tmp/monitor_state.txt" # 権限エラー回避のためtmp推奨

# ファイルの状態を読み込み
if [ -f "$STATE_FILE" ]; then
    FILE_STATE=$(cat "$STATE_FILE")
else
    FILE_STATE="25"
fi

# 前回Mac(25)ならWin(15)へ
if [ "$FILE_STATE" = "25" ]; then
    $M1DDC display 1 set input 15
    echo "15" > "$STATE_FILE"
else
    $M1DDC display 1 set input 25
    echo "25" > "$STATE_FILE"
fi


【Windows編】Stream Deckで物理操作を実現する

次に、Windowsをメインに使っている方向けの設定です。 WindowsにはSiriのようなOS標準の音声アシスタント連携はありませんが、物理ボタンデバイスの Stream Deck があれば最強です。

Windows用ツール:ControlMyMonitor

Windowsでは、無料の定番ツール ControlMyMonitor を使います。インストール不要で、exeファイルを置くだけで動きます。

設定手順(Windows版)

  1. ControlMyMonitor.exe をダウンロードし、解凍して起動します。
  2. 入力ソースの値を確認する: 起動すると値が並びますが、「VCP Code」が 60 (Input Select) の行を探してください。 その行の 「Current Value」 が、現在接続されている入力端子のIDです。(Mac編で調べた値と同じはずです)
  3. メモ帳を開き、切り替えたい入力番号に合わせてバッチファイルを作成します。

例:入力ソース「25 (USB-C/Mac)」へ切り替える場合 (SwitchToUSBC.bat として保存)

@echo off
:: VCPコード60(入力選択)に 25 をセット
C:\\\\Tools\\\\ControlMyMonitor.exe /SetValue Primary 60 25

  1. Stream Deck の設定アプリを開く。
  2. 「システム」カテゴリの 「開く (Open)」 アクションを配置。
  3. 「ファイル」の項目に、作成したバッチファイルを指定する。

これで、Windowsでの作業中もワンタッチでMacや他のPCへ画面を渡すことができます。


まとめ:Mac×Windows×外部モニター環境の最適解

今回の検証を通して、以下の知見が得られました。

  1. Macメインの人: Apple Silicon環境なら m1ddc が最適解。HomePod連携は SSH経由 で実現する。
  2. Windowsメインの人: ControlMyMonitor とStream Deckの相性が抜群。
  3. ロジック: 基本は「現状取得(get)」で実装し、モニターの相性が悪ければ「ファイル管理」で逃げるのが吉。

「MacからはSiri(音声)」「WindowsからはStream Deck(物理)」と使い分けることで、構築コストと利便性のバランスが取れた賢い運用が可能になります。 同じようにMacとWindowsの切り替えで悩んでいる方の参考になれば幸いです。

ちなみに、今回はApple製品(HomePod)と物理ボタン(Stream Deck)で構築しましたが、Alexa(Amazon Echo)をお使いの方も、「TriggerCMD」や「IFTTT」などのサービスを組み合わせれば、Windowsを音声操作することが理論上は可能です。 今回は「レスポンスの速さ」と「安定性」を重視して物理ボタンを採用しましたが、興味がある方はぜひ挑戦してみてください。

コメント

タイトルとURLをコピーしました