A Windows command-line utility to control monitor settings via DDC/CI (Display Data Channel Command Interface). Control input sources, brightness, contrast, and other VCP features without touching physical buttons.
The project is pre-configured with NativeAOT, which produces a native executable with instant startup and no .NET runtime dependency.
- 🖥️ List all DDC/CI capable monitors with their current input sources
- 🔍 EDID information - View monitor specifications, capabilities, and color characteristics
- 🔄 Switch monitor inputs programmatically (HDMI, DisplayPort, DVI, VGA, etc.)
- 🔆 Control brightness and contrast with percentage values (0-100%)
- 🎛️ Comprehensive VCP feature support - Access all MCCS standardized monitor controls
- 🔍 VCP scanning to discover all supported monitor features
- 🎯 Simple CLI interface perfect for scripts, shortcuts, and hotkeys
- 📊 JSON output support - Machine-readable output for automation and integration
- ⚡ Fast and lightweight - NativeAOT compiled for instant startup
- 📦 True native executable - No .NET runtime dependency required
- 🪟 Windows-only - uses native Windows DDC/CI APIs (use ddcutil on Linux)
Install via Chocolatey package manager:
choco install ddcswitchTo upgrade to the latest version:
choco upgrade ddcswitchDownload the latest release from the Releases page and extract ddcswitch.exe to a folder in your PATH.
- Copy
ddcswitch.exeto a folder (e.g.,C:\Tools\ddcswitch\). - Open Start Menu, search "Environment Variables", and select "Edit the system environment variables"
- Click "Environment Variables..."
- Under "System variables", select "Path" and click "Edit..."
- Click "New" and add the folder path (e.g.,
C:\Tools\ddcswitch\) - Click OK on all dialogs to apply changes.
- Restart any open command prompts or PowerShell windows.
Requirements:
- .NET 10.0 SDK or later
- Windows (x64)
- Visual Studio 2022 with "Desktop development with C++" workload (or C++ Build Tools)
Build:
git clone https://github.com/markdwags/ddcswitch.git
cd ddcswitch
dotnet publish -c ReleaseExecutable location: ddcswitch/bin/Release/net10.0/win-x64/publish/ddcswitch.exe
[!NOTE]
JSON output is supported with --json flag all data and commands.
Display all DDC/CI capable monitors with their current input sources:
ddcswitch listView detailed EDID (Extended Display Identification Data) information for a specific monitor:
ddcswitch info 0Get a specific feature by monitor index or name:
# Get brightness by monitor index
ddcswitch get 0 brightness
# Get input source by monitor name (partial match supported)
ddcswitch get "VG270U" inputSet brightness, contrast, or switch inputs by monitor index or name:
# Set brightness by index
ddcswitch set 0 brightness 75%
# Switch input by monitor name (partial match supported)
ddcswitch set "LG ULTRAGEAR" HDMI2Automatically switch between two input sources:
# Toggle between HDMI1 and DisplayPort1
ddcswitch toggle 0 HDMI1 DP1
# Toggle by monitor name
ddcswitch toggle "LG ULTRAGEAR" HDMI1 HDMI2The toggle command detects the current input and switches to the alternate one - perfect for hotkeys and automation.
For advanced users, access any VCP feature by code:
# Get raw VCP value (e.g., VCP code 0x10 for brightness)
ddcswitch get 0 0x10
# Set raw VCP value
ddcswitch set 0 0x10 120Discover all supported VCP features on all monitors:
ddcswitch get allThis scans all VCP codes (0x00-0xFF) for every monitor and displays supported features with their current values, maximum values, and access types (read-only, write-only, read-write).
To scan a specific monitor:
# Scan specific monitor by index
ddcswitch get 0
# Scan specific monitor by name
ddcswitch get "VG270U"- HDMI:
HDMI1,HDMI2 - DisplayPort:
DP1,DP2,DisplayPort1,DisplayPort2 - DVI:
DVI1,DVI2 - VGA/Analog:
VGA1,VGA2,Analog1,Analog2 - Other:
SVideo1,SVideo2,Tuner1,ComponentVideo1, etc. - Custom codes: Use hex values like
0x11for manufacturer-specific inputs
- Brightness:
brightness(VCP 0x10) - accepts percentage values (0-100%) - Contrast:
contrast(VCP 0x12) - accepts percentage values (0-100%) - Input Source:
input(VCP 0x60) - existing functionality maintained - Color Controls:
red-gain,green-gain,blue-gain(VCP 0x16, 0x18, 0x1A) - Audio:
volume,mute(VCP 0x62, 0x8D) - volume accepts percentage values - Geometry:
h-position,v-position,clock,phase(mainly for CRT monitors) - Presets:
restore-defaults,degauss(VCP 0x04, 0x01)
- Any VCP code from
0x00to0xFF - Values must be within the monitor's supported range
- Use hex format:
0x10,0x12, etc.
# List monitors
ddcswitch list
# Switch monitor input
ddcswitch set 0 HDMI1
# Adjust brightness
ddcswitch set 0 brightness 75%All commands support --json for machine-readable output, perfect for automation:
# Get monitor list as JSON
ddcswitch list --json
# Get specific monitor info as JSON
ddcswitch info 0 --jsonTo disable colors and icons (for logging or automation), set the NO_COLOR environment variable:
$env:NO_COLOR = "1"
ddcswitch listCreate a desktop shortcut to quickly adjust settings:
Target: C:\Path\To\ddcswitch.exe set 0 HDMI1
📚 For more examples including hotkeys, automation scripts, Stream Deck integration, and advanced usage, see EXAMPLES.md.
- Ensure your monitor supports DDC/CI (most modern monitors do)
- Check that DDC/CI is enabled in your monitor's OSD settings
- Try running as Administrator
- The input may not exist on your monitor
- Try running as Administrator
- Some monitors have quirks - try different input codes or use
listto see what works
- DDC/CI can be slow - wait a few seconds between commands
- Some monitors need to be on the target input at least once before DDC/CI can switch to it
- Check monitor OSD settings for DDC/CI enable/disable options
- Power cycle the monitor and/or remove and reconnect the video cable
Some monitors have non-standard DDC/CI implementations and may report incorrect current input values, even though input switching still works correctly. This is a monitor firmware limitation, not a tool issue.
If you prefer a graphical interface over the command-line, try ControlMyMonitor by NirSoft - a comprehensive GUI tool for DDC/CI control and debugging.
Linux has excellent DDC/CI support through ddcutil, which is more mature and feature-rich. Windows needed a similar command-line tool - while winddcutil exists, it requires Python dependencies. This project provides a standalone native executable with no runtime requirements, though it's not trying to be a direct clone of the Linux ddcutil.
Contributions welcome! Please open issues for bugs or feature requests.
MIT License - see LICENSE file for details
NO WARRANTY: This software is provided "AS IS" without warranty of any kind, either express or implied, including but not limited to the implied warranties of merchantability, fitness for a particular purpose, or non-infringement. The entire risk as to the quality and performance of the software is with you.
LIMITATION OF LIABILITY: In no event shall the authors, copyright holders, or contributors be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including but not limited to procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this software, even if advised of the possibility of such damage.
MONITOR DAMAGE: The authors and contributors of this software are not responsible for any damage to monitors, display devices, or other hardware that may result from the use of this software. DDC/CI commands can potentially affect monitor settings in ways that may cause temporary or permanent changes to display behavior. Users assume all risk when using this software to control monitor settings.
USE AT YOUR OWN RISK: By using this software, you acknowledge that you understand the risks involved in sending DDC/CI commands to your monitors and that you use this software entirely at your own risk. It is recommended to test commands carefully and ensure you can restore your monitor settings manually if needed.
- Inspired by ddcutil for Linux
- Uses Spectre.Console for beautiful terminal output