A lightweight Windows tray app that switches your monitors' active input (DisplayPort/HDMI/DVI/etc.) via DDC/CI, triggered by global hotkeys or the tray menu. Useful if you have monitors shared between multiple PCs and want a one-key/one-click way to flip all of them to the same source at once ("profiles").
Native Win32 GUI (no Electron/webview, no GPU rendering context) — idles around 16MB working set / ~2.6MB committed memory.
- Profiles: define named groups of per-monitor input assignments (e.g. "Gaming PC" -> Monitor 1: DP-1, Monitor 2: HDMI-2) and apply them all in one action.
- Global hotkeys: bind a hotkey to each profile to switch inputs from anywhere, without opening the window.
- Tray icon: left-click to open the window; right-click for a menu listing all profiles plus Settings/Quit.
- Identify Monitors: shows a numbered overlay badge on each monitor so you can tell which is which in the Monitors tab.
- Switch verification: after sending a DDC/CI input-switch command, reads back the monitor's state to confirm it actually switched (not just that the command was acknowledged). Can be disabled per-monitor for monitors whose read-back is unreliable.
- Manual VCP override: lets you enter a raw VCP input code by hand, for monitors whose advertised capability list doesn't match reality.
- Autostart: optional launch at Windows login.
- Single-instance guarded: launching a second copy just exits instead of creating a duplicate tray icon.
- Windows 10/11
- Monitor(s) that support DDC/CI input switching (must be enabled in the monitor's own OSD menu, if it has a toggle for it)
Download the latest monitor-switcher.exe (or the zip) from the Releases page and run it — no installer needed.
Requires a recent stable Rust toolchain.
cargo build --release
The binary is produced at target/release/monitor-switcher.exe.
- Launch the app. It starts minimized to the tray by default.
- Open the window from the tray icon (left-click, or right-click -> Open Settings).
- Monitors tab: click "Detect" to enumerate connected DDC/CI monitors. Use "Identify" to show which physical monitor is which.
- Profiles tab: add a profile, assign an input source per monitor, and optionally bind a hotkey.
- Apply a profile via its hotkey, or via the tray menu / Profiles tab.
Configuration is stored at %APPDATA%\monitor-switcher\config\config.json.
--tray— start minimized to the tray regardless of the saved setting.--debug-monitors— print all detected monitors, their VCP 0x60 input capabilities, and any EDID hardware info to the console (no GUI). Useful for diagnosing "monitor not detected" issues.--debug-set-input <index> <hex>— directly set one monitor (by the index shown in--debug-monitors) to a raw VCP input code, e.g.--debug-set-input 0 0x0F.
- A monitor doesn't respond to switching, or switches to the wrong input: some monitors advertise inaccurate VCP capability codes in their firmware. Use a tool like ControlMyMonitor to find the VCP code that actually works, then enter it via the "Manual override" checkbox on that monitor's assignment row in the Profiles tab.
- A monitor reports "FAILED" after switching but the switch actually worked: its DDC read-back doesn't reliably reflect its true state. Disable "Verify switches" for that monitor in the Monitors tab.
- DDC/CI must be enabled in the monitor's on-screen menu — some monitors ship with it off.
MIT — see LICENSE.