A comprehensive Windows GUI utility for controlling monitor settings via DDC/CI protocol. Adjust brightness, contrast, color temperature, input sources, and more — all without touching your monitor's physical buttons.
- Brightness & Contrast — Real-time adjustment via DDC/CI
- RGB Gain Control — Fine-tune red, green, and blue channels independently
- Color Temperature Presets — Quick access to Warm (5000K), 6500K (D65), Cool (9300K), and sRGB
- Sharpness Control — Adjust display sharpness if supported
- Dynamic Contrast — Switch display mode between standard (
0x00) and dynamic contrast (0xF0) through VCP0xDCon monitors that expose it - Picture Mode Presets — Apply Web/Productivity (
0x01), Cinema/Movie (0x03), or Game (0x05) display modes through VCP0xDC
- Visual Monitor Layout — Click-to-select interface matching Windows Display Settings
- Input Source Switching — Switch between HDMI, DisplayPort, USB-C, DVI, VGA
- Power Control — Turn monitors On, Standby, or Off via software
- PiP / PbP Controls — Toggle vendor-defined PiP/PbP modes and secondary input routing for ultrawide monitors that expose those DDC/CI controls
- Apply to All Monitors — Sync settings across all connected displays
- Monitor Identification — On-screen overlays showing monitor numbers
- Laptop Brightness Fallback — Uses
WmiMonitorBrightnessMethodsfor integrated displays when DDC/CI handles are unavailable
- System Tray Mode - Persistent notification-area icon with a brightness popup, linked-monitor toggle, and profile cycling
- Per-Application Profiles - Watch the foreground app and automatically apply a saved profile when its executable matches a rule
- Scheduled Profiles - Apply saved profiles automatically from explicit
HH:mmdaily schedule rules with a 24-hour timeline view - Idle Dim - Poll Windows idle time and dim all monitors after inactivity, with optional brightness restore on activity
- Ambient Light Mode - Poll Windows
LightSensorreadings and map lux to monitor brightness automatically when a sensor is available - Battery Profile - Apply separate brightness targets when Windows switches between AC power and battery
- Auto Mode - Automatic brightness and color temperature based on time of day:
- Day (7 AM - 6 PM): 80% brightness, neutral colors
- Evening (6 PM - 9 PM): 60% brightness, slightly warm
- Night (9 PM - 7 AM): 40% brightness, warm/reduced blue light
- Profile System — Save and load custom configurations
- Command-line Support — Launch minimized or with a specific profile
- VCP Explorer — Query and set any VCP code for advanced users
- VCP Code Scanner — Discover which DDC/CI features your monitor supports, including extended MCCS codes for gamma, OSD controls, indicators, auxiliary power, and display modes
- DDC/CI Capabilities Viewer — View raw capabilities string from monitor
- Software Gamma Control — Independent RGB gamma curves via Windows API
- Factory Reset — Reset monitor to factory defaults (colors only or full reset)
- Real-time temperature, utilization, and clock speed
- Memory usage and fan speed
- Power draw monitoring
- Digital vibrance slider using NVAPI DVC where supported
- AMD Radeon temperature, utilization, engine/memory clocks, and fan percent via ADL where supported by the installed driver
- CPU package/core temperature via LibreHardwareMonitorLib or OpenHardwareMonitorLib when either library is installed or placed next to the script
- PresentMon-powered FPS overlay when
PresentMon.exeorPresentMon64.exeis installed or placed next to the script
- Windows 10/11
- PowerShell 5.1+ (included with Windows)
- DDC/CI Compatible Monitor — Most modern monitors support this; ensure it's enabled in your monitor's OSD settings
- NVIDIA or AMD GPU (optional) — For GPU monitoring tab
- LibreHardwareMonitorLib.dll or OpenHardwareMonitorLib.dll (optional) — For CPU temperature on the hardware tab
- PresentMon.exe (optional) — For FPS overlay capture on the hardware tab
- Download
MonitorControlPro.ps1 - Right-click and select "Run with PowerShell"
irm https://raw.githubusercontent.com/SysAdminDoc/MonitorControl/main/MonitorControlPro.ps1 -OutFile MonitorControlPro.ps1
.\MonitorControlPro.ps1$WshShell = New-Object -ComObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut("$env:USERPROFILE\Desktop\MonitorControl Pro.lnk")
$Shortcut.TargetPath = "powershell.exe"
$Shortcut.Arguments = "-ExecutionPolicy Bypass -WindowStyle Hidden -File `"$PWD\MonitorControlPro.ps1`""
$Shortcut.IconLocation = "imageres.dll,109"
$Shortcut.Save().\MonitorControlPro.ps1# Start minimized (useful for startup)
.\MonitorControlPro.ps1 -StartMinimized
# Load a specific profile on launch
.\MonitorControlPro.ps1 -LoadProfile "Gaming"
# Combined
.\MonitorControlPro.ps1 -StartMinimized -LoadProfile "Night Mode"- Minimize the window to keep MonitorControl running from the notification area
- Click the tray icon to open the compact brightness popup
- Double-click the tray icon or use Next Profile in the tray menu to cycle saved profiles
- Use Link Monitors in the tray popup or menu to apply brightness changes to every detected monitor
- Create or load a saved monitor profile
- Open the Profiles tab, enable Per-application profiles, and map an executable name such as
photoshop.exeto a profile - Use Capture to grab the foreground executable after a short delay, or type the executable name directly
- Rules are saved in
%APPDATA%\MonitorControlPro\app-profile-rules.json
- Create or load a saved monitor profile
- Open the Schedule tab, enable Scheduled profiles, and add
HH:mmrules that map times to profiles - The timeline plots rules against a 24-hour axis so timing gaps are visible before saving more rules
- The watcher applies the latest due rule once per schedule boundary, including the current effective rule when scheduling is enabled
- Rules are saved in
%APPDATA%\MonitorControlPro\profile-schedules.json
- Open the Schedule tab and enable Idle dim
- Set the idle threshold in minutes, target brightness, and whether activity should restore the previous brightness
- Settings are saved in
%APPDATA%\MonitorControlPro\idle-dim.json
- Click on monitor rectangles to select different displays
- Use Tab to navigate between controls
- Slider values update in real-time
The VCP Explorer tab allows you to query and set any DDC/CI VCP code. Common codes:
| Code | Name | Range | Description |
|---|---|---|---|
0x10 |
Brightness | 0-100 | Display brightness level |
0x12 |
Contrast | 0-100 | Display contrast level |
0x14 |
Color Preset | varies | Color temperature preset |
0x16 |
Red Gain | 0-100 | Red channel gain |
0x18 |
Green Gain | 0-100 | Green channel gain |
0x1A |
Blue Gain | 0-100 | Blue channel gain |
0x60 |
Input Source | varies | Active input selection |
0x62 |
Volume | 0-100 | Speaker volume (if available) |
0x72 |
Gamma | varies | Hardware gamma control when exposed by the monitor |
0x87 |
Sharpness | 0-100 | Image sharpness |
0x8D |
Audio Mute | 1/2 | Mute speakers |
0xC0 |
Display Usage Time | read-only | Panel usage counter |
0xC6 |
Application Enable Key | varies | Vendor/application enable key |
0xCA |
OSD/Button Control | varies | Monitor OSD and button behavior |
0xCC |
OSD Language | varies | Monitor on-screen display language |
0xCD |
Status Indicators / LED | varies | Status indicator and power LED behavior when supported |
0xD6 |
Power Mode | 1-5 | Power state control |
0xD7 |
Aux Power Output | varies | Auxiliary power output control when supported |
0xDC |
Display Mode | varies | Preset picture/display modes |
0xDF |
VCP Version | read-only | Monitor VCP/MCCS version |
0xE8 |
Secondary Input Source | vendor-defined | Secondary PiP/PbP input on some Dell-style ultrawides |
0xE9 |
PiP/PbP Mode | vendor-defined | PiP/PbP mode on some Dell-style ultrawides |
0x04 |
Factory Reset | 1 | Reset all settings |
0x08 |
Color Reset | 1 | Reset color settings only |
| Value | Input |
|---|---|
0x01 |
VGA |
0x03 |
DVI |
0x0F |
DisplayPort 1 |
0x10 |
DisplayPort 2 |
0x11 |
HDMI 1 |
0x12 |
HDMI 2 |
0x13 |
USB-C |
| Code | Value | Meaning |
|---|---|---|
0xE9 |
0x00 |
PiP/PbP off |
0xE9 |
0x21 |
PiP upper-right |
0xE9 |
0x23 |
PbP split |
0xE8 |
0x21 |
Secondary DisplayPort |
0xE8 |
0x11 |
Secondary HDMI 1 |
0xE8 |
0x12 |
Secondary HDMI 2 |
| Value | State |
|---|---|
0x01 |
On |
0x02 |
Standby |
0x04 |
Off |
| Value | Mode |
|---|---|
0x00 |
Standard / default |
0x01 |
Productivity / Web |
0x03 |
Movie / Cinema |
0x05 |
Games |
0xF0 |
Dynamic Contrast |
Profiles are saved as JSON files in %APPDATA%\MonitorControlPro\
{
"SchemaVersion": 2,
"Name": "Gaming",
"Brightness": 80,
"Contrast": 70,
"Red": 50,
"Green": 50,
"Blue": 50,
"Gamma": 100,
"GammaRed": 100,
"GammaGreen": 100,
"GammaBlue": 100,
"UpdatedAt": "2026-06-28T10:30:00.0000000-04:00"
}Profiles without SchemaVersion are treated as v1 and migrated to the current schema on load.
Use Export Bundle on the Profiles tab to create a timestamped ZIP in %APPDATA%\MonitorControlPro\exports.
Use Import Bundle to restore every profile JSON from a bundle; corrupt entries are skipped without blocking valid profiles.
Use Sync Folder to point profile storage at a OneDrive or Dropbox folder. The pointer is stored in %APPDATA%\MonitorControlPro\profile-storage.json; Use Local switches back to %APPDATA%\MonitorControlPro.
Night Mode — Reduced brightness and blue light
{
"Name": "Night Mode",
"Brightness": 35,
"Contrast": 50,
"Red": 50,
"Green": 48,
"Blue": 40,
"Gamma": 100,
"GammaRed": 100,
"GammaGreen": 95,
"GammaBlue": 80
}Photography — Accurate colors for editing
{
"Name": "Photography",
"Brightness": 50,
"Contrast": 50,
"Red": 50,
"Green": 50,
"Blue": 50,
"Gamma": 100,
"GammaRed": 100,
"GammaGreen": 100,
"GammaBlue": 100
}- Enable DDC/CI — Check your monitor's OSD settings for DDC/CI option and ensure it's enabled
- Check Cable — DDC/CI works best over DisplayPort and HDMI; some adapters don't pass through DDC/CI signals
- Try Different Port — Some monitor ports may have DDC/CI disabled
- Some monitors have a delay (~50ms per command)
- Certain VCP codes may not be supported by your specific monitor
- Use the VCP Scanner to discover which features your monitor actually supports
Laptop integrated displays typically don't support DDC/CI. Use Windows brightness controls or WMI-based tools instead.
Your monitor either:
- Doesn't support DDC/CI
- Has DDC/CI disabled in OSD
- Is connected through an incompatible adapter/dock
- dxva2.dll — Windows DDC/CI implementation
GetPhysicalMonitorsFromHMONITORGetVCPFeatureAndVCPFeatureReplySetVCPFeatureCapabilitiesRequestAndCapabilitiesReply
- gdi32.dll — Software gamma control
SetDeviceGammaRamp
- user32.dll — Monitor enumeration
EnumDisplayMonitorsGetMonitorInfo
- Profiles:
%APPDATA%\MonitorControlPro\*.json - No registry modifications
- No admin rights required
This project was inspired by and incorporates concepts from these excellent open-source projects:
- Twinkle Tray — System tray brightness control, time-based automation
- Monitorian — Clean WPF implementation, unison mode concept
- ControlMyMonitor — Comprehensive VCP exploration
- MonitorConfig — PowerShell DDC/CI module
- LightBulb — Gamma-based color temperature
- display-switch — Input source switching concepts
Contributions are welcome! Please feel free to submit a Pull Request.
- Clone the repository
- Edit
MonitorControlPro.ps1in your preferred editor (VS Code with PowerShell extension recommended) - Test changes by running the script directly
- Multi-monitor profile linking
- WMI fallback for laptop displays
MIT License — see LICENSE for details.
This software interacts with monitor hardware via DDC/CI protocol. While DDC/CI is a standard protocol and this software uses official Windows APIs, use at your own risk. The author is not responsible for any damage to monitors or other hardware.
Made with PowerShell and WPF
Report Bug ·
Request Feature