docs(ci): add comprehensive user guide for Monitor Control
Add 650+ line GUIDE.md covering installation, configuration, and usage of Monitor Control application. Includes step-by-step instructions for adjusting brightness/contrast, switching input sources, managing power states, configuring ports, troubleshooting DDC/CI issues, and technical notes on rate limiting. Update README.md with improved feature descriptions and link to new user guide.
This commit is contained in:
653
GUIDE.md
Normal file
653
GUIDE.md
Normal file
@@ -0,0 +1,653 @@
|
||||
# Monitor Control - User Guide
|
||||
|
||||
A Windows application for controlling DDC/CI-enabled monitors. Adjust brightness, contrast, input sources, and power settings through a simple system tray interface or WPF management window.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
- [Features](#features)
|
||||
- [System Requirements](#system-requirements)
|
||||
- [Installation](#installation)
|
||||
- [Getting Started](#getting-started)
|
||||
- [Common Workflows](#common-workflows)
|
||||
- [Adjusting Monitor Settings](#adjusting-monitor-settings)
|
||||
- [Switching Input Sources](#switching-input-sources)
|
||||
- [Managing Power States](#managing-power-states)
|
||||
- [Quick-Switch Toolbar](#quick-switch-toolbar)
|
||||
- [Configuration](#configuration)
|
||||
- [Customizing Port Labels](#customizing-port-labels)
|
||||
- [Hiding Unused Ports](#hiding-unused-ports)
|
||||
- [Detecting Additional Ports](#detecting-additional-ports)
|
||||
- [Troubleshooting](#troubleshooting)
|
||||
- [Best Practices](#best-practices)
|
||||
- [Multi-Language Support](#multi-language-support)
|
||||
- [Technical Notes](#technical-notes)
|
||||
|
||||
---
|
||||
|
||||
## Features
|
||||
|
||||
- **Brightness & Contrast Control**: Adjust monitor brightness and contrast via sliders (VCP codes 10 and 12)
|
||||
- **Input Source Switching**: Switch between HDMI, DisplayPort, DVI, VGA, and other inputs (VCP code 60)
|
||||
- **Power Management**: Turn monitors on/off or put them to sleep (VCP code D6)
|
||||
- **Quick-Switch Toolbar**: Create custom buttons for frequently-used input sources
|
||||
- **Port Configuration**: Rename ports, hide unused inputs, and detect undiscovered ports
|
||||
- **System Tray Integration**: Lightweight tray icon with popup control panel
|
||||
- **Multi-Monitor Support**: Manage all DDC/CI-enabled monitors from one interface
|
||||
- **9-Language Localization**: English, Spanish, French, German, Chinese, Japanese, Portuguese, Italian, Hindi
|
||||
- **Automatic Updates**: Checks for new releases from git.marketally.com
|
||||
|
||||
---
|
||||
|
||||
## System Requirements
|
||||
|
||||
- **Operating System**: Windows Vista or later (tested on Windows 11)
|
||||
- **.NET Runtime**: .NET 9.0 (included in installer)
|
||||
- **Hardware**: DDC/CI-enabled monitor(s) connected via digital cable (HDMI, DisplayPort, DVI)
|
||||
- **Cable Type**: VGA cables often do not support DDC/CI; use digital cables for best results
|
||||
- **Graphics Driver**: Up-to-date driver recommended for reliable DDC/CI communication
|
||||
|
||||
**Note**: Some monitors do not support all VCP features. Power control and input switching support varies by manufacturer.
|
||||
|
||||
---
|
||||
|
||||
## Installation
|
||||
|
||||
### Option 1: Installer (Recommended)
|
||||
|
||||
1. Download the latest `.exe` installer from [git.marketally.com](https://git.marketally.com/misc/ControlMyMonitorManagement/releases)
|
||||
2. Run the installer and follow the prompts
|
||||
3. The application will launch automatically and add a tray icon
|
||||
4. Monitor Control will start with Windows by default
|
||||
|
||||
### Option 2: Build from Source
|
||||
|
||||
1. Clone the repository:
|
||||
```bash
|
||||
git clone https://git.marketally.com/misc/ControlMyMonitorManagement.git
|
||||
cd ControlMyMonitorManagement
|
||||
```
|
||||
|
||||
2. Open `ControlMyMonitorManagement.sln` in Visual Studio 2022 or later
|
||||
|
||||
3. Restore NuGet packages:
|
||||
```bash
|
||||
dotnet restore
|
||||
```
|
||||
|
||||
4. Build the `MonitorControl` project:
|
||||
```bash
|
||||
dotnet build MonitorControl/MonitorControl.csproj -c Release
|
||||
```
|
||||
|
||||
5. Run the executable:
|
||||
```bash
|
||||
MonitorControl/bin/Release/net9.0-windows/MonitorControl.exe
|
||||
```
|
||||
|
||||
**Required Files**: The application depends on `ControlMyMonitor.exe` (by NirSoft) which must be in the same directory as the main executable. This file is included in the repository under `Library/Resource/`.
|
||||
|
||||
---
|
||||
|
||||
## Getting Started
|
||||
|
||||
### First Launch
|
||||
|
||||
1. After installation, look for the monitor icon in your system tray (near the clock)
|
||||
2. Click the tray icon to open the control panel
|
||||
3. The application will scan for DDC/CI monitors (takes 2-5 seconds)
|
||||
4. Your monitors will appear with available controls
|
||||
|
||||
### Understanding the Interface
|
||||
|
||||
The control panel displays one section per detected monitor:
|
||||
|
||||
- **Monitor Name**: Shown at the top of each section (e.g., "22EA53")
|
||||
- **Brightness Slider**: 0-100% range
|
||||
- **Contrast Slider**: 0-100% range
|
||||
- **Input Dropdown**: Lists available input sources (HDMI, DisplayPort, etc.)
|
||||
- **Power Button**: Shows current state (PowerOn, Sleep, PowerOff)
|
||||
- **Config Button**: Opens port configuration window
|
||||
|
||||
### If No Monitors Appear
|
||||
|
||||
If you see "No DDC/CI monitors detected":
|
||||
|
||||
1. Verify your monitor supports DDC/CI (check monitor OSD settings for "DDC/CI Enable")
|
||||
2. Use a digital cable (HDMI, DisplayPort, DVI) — VGA often lacks DDC/CI support
|
||||
3. Update your graphics card driver
|
||||
4. Try unplugging and reconnecting the monitor
|
||||
5. If using a KVM switch, try connecting directly to the computer
|
||||
6. Click "Show Log" (appears after 3 seconds) to view debug information
|
||||
|
||||
---
|
||||
|
||||
## Common Workflows
|
||||
|
||||
### Adjusting Monitor Settings
|
||||
|
||||
**Brightness:**
|
||||
|
||||
1. Click the tray icon to open the control panel
|
||||
2. Find the "Brightness" slider for your monitor
|
||||
3. Drag the slider to adjust (0-100%)
|
||||
4. Release the mouse button to apply the change
|
||||
5. The monitor will update within 1-2 seconds
|
||||
|
||||
**Contrast:**
|
||||
|
||||
1. Follow the same steps as brightness
|
||||
2. Use the "Contrast" slider instead
|
||||
|
||||
**Tips:**
|
||||
- Adjustments are applied when you release the mouse button, not while dragging
|
||||
- If the monitor doesn't respond, wait 3-5 seconds and try again
|
||||
- After waking from sleep, wait 8 seconds before adjusting settings (monitors need time to initialize)
|
||||
|
||||
### Switching Input Sources
|
||||
|
||||
**Manual Switching:**
|
||||
|
||||
1. Open the control panel
|
||||
2. Find the "Input" dropdown for your monitor
|
||||
3. Click the dropdown to see available sources:
|
||||
- DisplayPort-1, DisplayPort-2
|
||||
- HDMI-1, HDMI-2
|
||||
- DVI-1, DVI-2
|
||||
- VGA-1, VGA-2
|
||||
- And others depending on your monitor
|
||||
4. Select the desired input
|
||||
5. The monitor will switch within 2-3 seconds
|
||||
|
||||
**Example: Switch from HDMI to DisplayPort**
|
||||
|
||||
1. Current input shows "HDMI-1"
|
||||
2. Click the dropdown
|
||||
3. Select "DisplayPort-1"
|
||||
4. Monitor switches to DisplayPort input
|
||||
|
||||
**If an Input Doesn't Appear:**
|
||||
|
||||
Some monitors don't report all available inputs via DDC/CI. See [Detecting Additional Ports](#detecting-additional-ports) below.
|
||||
|
||||
### Managing Power States
|
||||
|
||||
**Turn Off Monitor:**
|
||||
|
||||
1. Click the Power button (shows "PowerOn")
|
||||
2. Monitor enters sleep/standby mode
|
||||
3. Button updates to "Sleep" or "PowerOff"
|
||||
|
||||
**Turn On Monitor:**
|
||||
|
||||
1. Click the Power button (shows "Sleep" or "PowerOff")
|
||||
2. Monitor wakes up
|
||||
3. Button updates to "PowerOn"
|
||||
|
||||
**Notes:**
|
||||
- Some monitors don't support power control via DDC/CI (button will show "Power Unsupported")
|
||||
- Power state detection varies by monitor firmware
|
||||
- Turning off via DDC/CI is not the same as pressing the physical power button
|
||||
|
||||
### Quick-Switch Toolbar
|
||||
|
||||
The quick-switch toolbar provides one-click buttons for frequently-used input sources.
|
||||
|
||||
**Setup:**
|
||||
|
||||
1. Click the **Config** button next to a monitor name
|
||||
2. For each input port you want in the toolbar:
|
||||
- Check "Show in quick-switch toolbar"
|
||||
- Optionally set a custom label (e.g., "Gaming PC", "Laptop")
|
||||
3. Click **Save**
|
||||
4. The toolbar appears at the top of the control panel
|
||||
|
||||
**Usage:**
|
||||
|
||||
1. Open the control panel
|
||||
2. Click any quick-switch button to instantly change input
|
||||
3. The corresponding dropdown updates automatically
|
||||
|
||||
**Example Configuration:**
|
||||
|
||||
Monitor: Dell U2720Q
|
||||
- Port: HDMI-1 → Label: "Work Laptop" → Quick-switch: ✓
|
||||
- Port: DisplayPort-1 → Label: "Gaming PC" → Quick-switch: ✓
|
||||
- Port: HDMI-2 → Hidden (unused)
|
||||
|
||||
Result: Two buttons appear: "Work Laptop" and "Gaming PC"
|
||||
|
||||
---
|
||||
|
||||
## Configuration
|
||||
|
||||
### Customizing Port Labels
|
||||
|
||||
By default, ports use generic names like "HDMI-1" or "DisplayPort-1". You can rename them:
|
||||
|
||||
1. Click **Config** next to the monitor name
|
||||
2. Find the port you want to rename
|
||||
3. Enter a custom label (e.g., "Xbox", "Work PC", "MacBook")
|
||||
4. Click **Save**
|
||||
5. The new label appears in the Input dropdown and quick-switch toolbar
|
||||
|
||||
**Example:**
|
||||
|
||||
| Port | Default Name | Custom Label |
|
||||
|---------------|-----------------|--------------|
|
||||
| VCP Value 17 | HDMI-1 | Gaming PC |
|
||||
| VCP Value 15 | DisplayPort-1 | Work Laptop |
|
||||
| VCP Value 18 | HDMI-2 | Streaming PC |
|
||||
|
||||
### Hiding Unused Ports
|
||||
|
||||
If your monitor reports inputs you don't use, you can hide them:
|
||||
|
||||
1. Click **Config**
|
||||
2. Check the "Hide" checkbox next to unused ports
|
||||
3. Click **Save**
|
||||
4. Hidden ports won't appear in the Input dropdown
|
||||
|
||||
**Important**: The currently active input is never hidden, even if marked as hidden. This prevents confusion about which input is selected.
|
||||
|
||||
### Detecting Additional Ports
|
||||
|
||||
Some monitors don't report all available inputs via DDC/CI. The port detection feature probes for undiscovered inputs.
|
||||
|
||||
**How It Works:**
|
||||
|
||||
1. Click **Config**
|
||||
2. Click **Detect**
|
||||
3. Read the warning dialog carefully
|
||||
4. Click **Yes** to proceed
|
||||
5. The application will:
|
||||
- Save your current input
|
||||
- Try switching to common ports (DisplayPort-1, DisplayPort-2, HDMI-1, HDMI-2)
|
||||
- Wait 3 seconds per port to check if the switch succeeded
|
||||
- Restore your original input
|
||||
6. Any newly discovered ports are added to the configuration
|
||||
|
||||
**Example Output:**
|
||||
|
||||
```
|
||||
Detected 2 new port(s):
|
||||
• DisplayPort-1
|
||||
• HDMI-2
|
||||
```
|
||||
|
||||
**Warnings:**
|
||||
|
||||
- Your screen may go black briefly during each probe
|
||||
- The process takes 10-20 seconds for 4 ports
|
||||
- Don't run detection repeatedly in a short time (can stress monitor scaler)
|
||||
- Click **Cancel** anytime to stop detection
|
||||
- Detection is safe for most monitors but use sparingly
|
||||
|
||||
**When to Use Detection:**
|
||||
|
||||
- Your monitor has a port that doesn't appear in the dropdown
|
||||
- You know the monitor supports an input but it's not listed
|
||||
- After connecting a new cable type
|
||||
|
||||
**When NOT to Use Detection:**
|
||||
|
||||
- All your ports already appear correctly
|
||||
- You just want to rename existing ports (use custom labels instead)
|
||||
- Your monitor is behaving strangely (wait for it to stabilize first)
|
||||
|
||||
### Resetting Configuration
|
||||
|
||||
To restore default settings:
|
||||
|
||||
1. Click **Config**
|
||||
2. Click **Reset**
|
||||
3. All custom labels are cleared
|
||||
4. All ports are unhidden
|
||||
5. Quick-switch toolbar is cleared
|
||||
6. Discovered ports are removed
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Monitor Not Detected
|
||||
|
||||
**Symptoms**: "No DDC/CI monitors detected" message
|
||||
|
||||
**Solutions**:
|
||||
|
||||
1. **Enable DDC/CI in Monitor OSD**:
|
||||
- Press the monitor's menu button
|
||||
- Look for "DDC/CI" or "External Control" setting
|
||||
- Set to "On" or "Enable"
|
||||
|
||||
2. **Check Cable Type**:
|
||||
- VGA cables often lack DDC/CI support
|
||||
- Use HDMI, DisplayPort, or DVI instead
|
||||
- Try a different cable if available
|
||||
|
||||
3. **Update Graphics Driver**:
|
||||
- Visit your GPU manufacturer's website (NVIDIA, AMD, Intel)
|
||||
- Download the latest driver
|
||||
- Restart after installation
|
||||
|
||||
4. **Direct Connection**:
|
||||
- If using a KVM switch, try connecting directly to the PC
|
||||
- Some KVM switches block DDC/CI signals
|
||||
|
||||
5. **Restart Monitor**:
|
||||
- Unplug monitor power cable
|
||||
- Wait 10 seconds
|
||||
- Plug back in and power on
|
||||
|
||||
### Controls Not Responding
|
||||
|
||||
**Symptoms**: Sliders move but monitor doesn't change
|
||||
|
||||
**Solutions**:
|
||||
|
||||
1. **Wait After Sleep/Resume**:
|
||||
- After waking PC from sleep, wait 8 seconds before adjusting
|
||||
- Monitor scalers need time to initialize DDC/CI
|
||||
|
||||
2. **Check Error Codes**:
|
||||
- Click "Show Log" button (appears after 3 seconds of loading)
|
||||
- Look for error codes like `0xC0262582` or `0xC0262583`
|
||||
- These indicate DDC/CI communication failure
|
||||
|
||||
3. **Reduce Command Frequency**:
|
||||
- Don't drag sliders rapidly
|
||||
- Wait 1-2 seconds between adjustments
|
||||
- The application enforces 50ms minimum spacing between commands
|
||||
|
||||
4. **Monitor Timeout Cooldown**:
|
||||
- If a command times out, the monitor is backed off for 3 seconds
|
||||
- Wait and try again
|
||||
- Persistent timeouts indicate hardware/firmware issue
|
||||
|
||||
5. **Firmware Update**:
|
||||
- Check monitor manufacturer's website for firmware updates
|
||||
- Some bugs are fixed in newer firmware
|
||||
|
||||
### Input Switching Fails
|
||||
|
||||
**Symptoms**: Input dropdown changes but monitor doesn't switch
|
||||
|
||||
**Possible Causes**:
|
||||
|
||||
1. **No Signal on Target Input**:
|
||||
- The monitor may refuse to switch if no device is connected to that input
|
||||
- Connect a device to the target input first
|
||||
|
||||
2. **Monitor Doesn't Support DDC/CI Input Switching**:
|
||||
- Some monitors allow brightness/contrast control but not input switching
|
||||
- Use the monitor's physical buttons instead
|
||||
|
||||
3. **Scaler Busy**:
|
||||
- If you just switched inputs manually, wait 5 seconds before using DDC/CI
|
||||
- Monitor scaler may be locked during manual input changes
|
||||
|
||||
### Power Control Doesn't Work
|
||||
|
||||
**Symptoms**: Power button shows "Power Unsupported" or doesn't respond
|
||||
|
||||
**Explanation**:
|
||||
|
||||
- Power control (VCP code D6) is optional in the DDC/CI spec
|
||||
- Many monitors don't implement it or implement it incorrectly
|
||||
- This is a monitor firmware limitation, not a software bug
|
||||
|
||||
**Workaround**:
|
||||
|
||||
- Use the monitor's physical power button
|
||||
- Use Windows display settings to turn off displays
|
||||
- Some monitors support power control only in specific modes (check OSD settings)
|
||||
|
||||
### Application Crashes or Hangs
|
||||
|
||||
**Symptoms**: Window freezes, doesn't respond, or closes unexpectedly
|
||||
|
||||
**Solutions**:
|
||||
|
||||
1. **Check Debug Log**:
|
||||
- Click "Show Log" button
|
||||
- Click "Open Log File" to view full log
|
||||
- Look for exceptions or error messages
|
||||
- Copy log when reporting issues
|
||||
|
||||
2. **Restart Application**:
|
||||
- Right-click tray icon → Exit
|
||||
- Launch again from Start Menu
|
||||
|
||||
3. **Reinstall**:
|
||||
- Uninstall via Windows Settings → Apps
|
||||
- Download latest version
|
||||
- Reinstall
|
||||
|
||||
4. **Report Issue**:
|
||||
- Copy debug log
|
||||
- Note your monitor model and connection type
|
||||
- Report at git.marketally.com/misc/ControlMyMonitorManagement/issues
|
||||
|
||||
### Error Code Reference
|
||||
|
||||
| Error Code | Meaning | Solution |
|
||||
|--------------|----------------------------------|-------------------------------------------|
|
||||
| 0xC0262582 | DDC/CI device not found | Enable DDC/CI in monitor OSD |
|
||||
| 0xC0262583 | DDC/CI communication timeout | Update graphics driver, try different cable |
|
||||
| Exit Code -1 | Command timeout (5 seconds) | Wait for cooldown, check monitor health |
|
||||
|
||||
---
|
||||
|
||||
## Best Practices
|
||||
|
||||
### DDC/CI Command Spacing
|
||||
|
||||
- **Don't spam commands**: The application enforces 50ms minimum spacing, but monitors appreciate longer gaps
|
||||
- **Wait after sleep**: Always wait 8 seconds after system resume before sending commands
|
||||
- **One adjustment at a time**: Don't drag multiple sliders simultaneously
|
||||
|
||||
### Post-Sleep Behavior
|
||||
|
||||
When your PC wakes from sleep:
|
||||
|
||||
1. Monitor scalers need 5-8 seconds to fully initialize
|
||||
2. The application activates an 8-second grace period automatically
|
||||
3. Commands sent during this period are delayed until it expires
|
||||
4. This prevents scaler lockout and command failures
|
||||
|
||||
### KVM Switch Users
|
||||
|
||||
If you use a KVM switch:
|
||||
|
||||
- DDC/CI may not work through the KVM (depends on model)
|
||||
- Try connecting one monitor directly to test
|
||||
- Some KVMs have "DDC/CI passthrough" settings — enable if available
|
||||
|
||||
### Multiple Monitors
|
||||
|
||||
- The application manages all monitors independently
|
||||
- Each monitor has its own command queue and rate limiting
|
||||
- Switching inputs on multiple monitors simultaneously is safe
|
||||
- Configuration is saved per monitor (by serial number)
|
||||
|
||||
### Firmware Quirks
|
||||
|
||||
Different monitor brands have different DDC/CI implementations:
|
||||
|
||||
- **Dell**: Generally excellent DDC/CI support
|
||||
- **LG**: Good support, some models have slow response times
|
||||
- **Samsung**: Variable support, some models don't report current input correctly
|
||||
- **ASUS**: Usually good, gaming monitors sometimes have limited VCP codes
|
||||
- **BenQ**: Mixed support, check DDC/CI setting in OSD
|
||||
|
||||
If your monitor doesn't report its current input correctly, the application will still attempt to add it to the list when detected.
|
||||
|
||||
---
|
||||
|
||||
## Multi-Language Support
|
||||
|
||||
The application automatically detects your Windows language and uses the best matching translation.
|
||||
|
||||
**Supported Languages:**
|
||||
|
||||
- English (en)
|
||||
- Spanish (es)
|
||||
- French (fr)
|
||||
- German (de)
|
||||
- Chinese (zh)
|
||||
- Japanese (ja)
|
||||
- Portuguese (pt)
|
||||
- Italian (it)
|
||||
- Hindi (hi)
|
||||
|
||||
**Changing Language:**
|
||||
|
||||
The application uses Windows system language. To change:
|
||||
|
||||
1. Open Windows Settings → Time & Language → Language
|
||||
2. Add or set preferred language
|
||||
3. Restart Monitor Control
|
||||
|
||||
**Fallback**: If your language isn't supported, the application defaults to English.
|
||||
|
||||
---
|
||||
|
||||
## Technical Notes
|
||||
|
||||
### DDC/CI Protocol
|
||||
|
||||
Monitor Control uses the DDC/CI (Display Data Channel / Command Interface) protocol to communicate with monitors over the video cable. This is a standardized protocol (VESA DDC/CI 1.1) supported by most modern monitors.
|
||||
|
||||
**VCP Codes Used:**
|
||||
|
||||
| VCP Code | Feature | Read/Write |
|
||||
|----------|-------------------|------------|
|
||||
| 10 | Brightness | Read/Write |
|
||||
| 12 | Contrast | Read/Write |
|
||||
| 60 | Input Source | Read/Write |
|
||||
| D6 | Power Mode | Read/Write |
|
||||
|
||||
### ControlMyMonitor.exe
|
||||
|
||||
This application wraps [ControlMyMonitor](https://www.nirsoft.net/utils/control_my_monitor.html) by NirSoft (freeware). The `ControlMyMonitor.exe` binary is included in the `Library/Resource/` folder and must be present for the application to function.
|
||||
|
||||
**License**: ControlMyMonitor is freeware by Nir Sofer. See `Library/Resource/readme.txt` for details.
|
||||
|
||||
### Configuration Storage
|
||||
|
||||
Monitor configurations are stored in JSON format at:
|
||||
|
||||
```
|
||||
%APPDATA%\MonitorControl\config.json
|
||||
```
|
||||
|
||||
**Structure:**
|
||||
|
||||
```json
|
||||
{
|
||||
"Monitors": [
|
||||
{
|
||||
"SerialNumber": "ABC123",
|
||||
"MonitorName": "Dell U2720Q",
|
||||
"Ports": [
|
||||
{
|
||||
"VcpValue": 17,
|
||||
"DefaultName": "HDMI-1",
|
||||
"CustomLabel": "Gaming PC",
|
||||
"IsHidden": false,
|
||||
"ShowInQuickSwitch": true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
You can manually edit this file if needed (close the application first).
|
||||
|
||||
### Debug Logging
|
||||
|
||||
Debug logs are written to:
|
||||
|
||||
```
|
||||
%TEMP%\CMM\debug.log
|
||||
```
|
||||
|
||||
To view logs:
|
||||
|
||||
1. Click "Show Log" button in the control panel (appears after 3 seconds of loading)
|
||||
2. Click "Open Log File" to view in Explorer
|
||||
3. Click "Copy to Clipboard" to paste into bug reports
|
||||
|
||||
Logs include:
|
||||
|
||||
- Monitor scan results
|
||||
- VCP command requests and responses
|
||||
- Error codes and timeout events
|
||||
- System resume events
|
||||
|
||||
### Update Mechanism
|
||||
|
||||
The application checks for updates from:
|
||||
|
||||
```
|
||||
https://git.marketally.com/api/v1/repos/misc/ControlMyMonitorManagement/releases/latest
|
||||
```
|
||||
|
||||
Update checks occur:
|
||||
|
||||
- On first launch
|
||||
- Once per hour while the application is running
|
||||
- When you click the tray icon (if more than 1 hour since last check)
|
||||
|
||||
If an update is available:
|
||||
|
||||
- A banner appears at the top of the control panel
|
||||
- A balloon notification appears in the system tray
|
||||
- Clicking either opens the download page in your browser
|
||||
|
||||
Updates are not automatic — you must download and run the installer manually.
|
||||
|
||||
### Rate Limiting and Throttling
|
||||
|
||||
To protect monitor scalers from command overload:
|
||||
|
||||
1. **Per-Monitor Command Spacing**: Minimum 50ms between commands to the same monitor
|
||||
2. **Post-Resume Grace Period**: 8-second delay after system wake
|
||||
3. **Timeout Cooldown**: 3-second backoff after a command timeout
|
||||
4. **Global DDC Lock**: Prevents parallel commands from overwhelming the DDC/CI bus
|
||||
|
||||
These limits are enforced automatically and cannot be disabled.
|
||||
|
||||
---
|
||||
|
||||
## Tips
|
||||
|
||||
- **Keyboard Shortcuts**: None currently implemented (tray-only interface)
|
||||
- **Startup Behavior**: Application starts minimized to tray by default
|
||||
- **Window Position**: Control panel appears near the system tray (bottom-right)
|
||||
- **Auto-Hide**: Control panel closes when it loses focus (click elsewhere)
|
||||
- **Config Persistence**: All settings survive application restart
|
||||
- **Monitor Hotplug**: Disconnect/reconnect monitors are detected on next tray icon click
|
||||
|
||||
---
|
||||
|
||||
## Credits
|
||||
|
||||
- **Original Project**: ControlMyMonitorManagement by DangWang
|
||||
- **Enhancements**: Brightness/contrast controls, input switching, multi-language support, quick-switch toolbar by David H. Friedel Jr (MarketAlly)
|
||||
- **DDC/CI Tool**: ControlMyMonitor by Nir Sofer (NirSoft)
|
||||
|
||||
---
|
||||
|
||||
## License
|
||||
|
||||
- **New Contributions**: MIT License (see LICENSE file)
|
||||
- **Original Code**: No explicit license provided by DangWang
|
||||
- **ControlMyMonitor.exe**: Freeware by NirSoft (no commercial use, no modification)
|
||||
|
||||
---
|
||||
|
||||
**For issues, feature requests, or contributions**, visit:
|
||||
|
||||
[https://git.marketally.com/misc/ControlMyMonitorManagement](https://git.marketally.com/misc/ControlMyMonitorManagement)
|
||||
234
README.md
234
README.md
@@ -6,14 +6,31 @@ A lightweight Windows utility for controlling monitor settings via DDC/CI. Adjus
|
||||

|
||||

|
||||
|
||||
## Table of Contents
|
||||
|
||||
- [Features](#features)
|
||||
- [Requirements](#requirements)
|
||||
- [Installation](#installation)
|
||||
- [Usage](#usage)
|
||||
- [Configuration](#configuration)
|
||||
- [Command-Line Options](#command-line-options)
|
||||
- [Troubleshooting](#troubleshooting)
|
||||
- [Credits](#credits)
|
||||
- [License](#license)
|
||||
|
||||
## Features
|
||||
|
||||
- **System Tray Integration** - Clean popup interface accessible from taskbar
|
||||
- **Multi-Monitor Support** - Control all DDC/CI compatible displays
|
||||
- **Brightness & Contrast** - Slider controls with real-time feedback
|
||||
- **Input Source Switching** - Auto-detects available inputs (HDMI, DisplayPort, DVI, VGA)
|
||||
- **Port Configuration** - Customize port labels, hide unused ports, and create quick-switch buttons
|
||||
- **Quick-Switch Toolbar** - One-click switching between frequently-used input sources
|
||||
- **Port Detection** - Automatically discover available input ports on your monitor
|
||||
- **Power Management** - On, Sleep, and Off controls
|
||||
- **Multi-Language** - Auto-detects system language (English, Spanish, French, German, Chinese, Japanese, Portuguese, Italian, Hindi)
|
||||
- **Auto-Update Check** - Notifies you when new versions are available
|
||||
- **System Resume Protection** - Prevents DDC/CI commands during monitor wake-up to avoid scaler lockout
|
||||
|
||||
## Requirements
|
||||
|
||||
@@ -21,62 +38,239 @@ A lightweight Windows utility for controlling monitor settings via DDC/CI. Adjus
|
||||
- .NET 9.0 Runtime
|
||||
- DDC/CI compatible monitor(s)
|
||||
|
||||
> **Note:** Most external monitors support DDC/CI, but some laptop internal displays and certain monitors may not support this protocol.
|
||||
> **Note:** Most external monitors support DDC/CI, but some laptop internal displays and certain monitors may not support this protocol. If you encounter error codes like `0xc0262582` or `0xc0262583`, see the [Troubleshooting](#troubleshooting) section.
|
||||
|
||||
## Installation
|
||||
|
||||
### From Release
|
||||
Download the latest release and run the executable. The app will appear in your system tray.
|
||||
|
||||
1. Download the latest release from the [releases page](https://git.marketally.com/misc/ControlMyMonitorManagement/releases)
|
||||
2. Extract the archive to a folder of your choice
|
||||
3. Run `MonitorControl.exe`
|
||||
4. The app will appear in your system tray
|
||||
|
||||
### Build from Source
|
||||
|
||||
```powershell
|
||||
git clone https://git.marketally.com/misc/ControlMyMonitorManagement.git
|
||||
cd ControlMyMonitorManagement
|
||||
dotnet build
|
||||
dotnet run --project DellMonitorControl
|
||||
dotnet run --project MonitorControl
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
1. Launch the application - it minimizes to system tray
|
||||
### Basic Operation
|
||||
|
||||
1. Launch the application - it minimizes to the system tray
|
||||
2. Click the tray icon to open the control panel
|
||||
3. Adjust brightness/contrast with sliders
|
||||
4. Select input source from dropdown (if multiple available)
|
||||
5. Toggle power state with the power button
|
||||
6. Click outside the popup to close
|
||||
|
||||
## Project Structure
|
||||
### Port Configuration
|
||||
|
||||
| Project | Description |
|
||||
|---------|-------------|
|
||||
| `DellMonitorControl` | System tray application with popup UI |
|
||||
| `ControlMyMonitorManagement` | Full WPF application (alternative) |
|
||||
| `Library` | Core DDC/CI operations via ControlMyMonitor.exe |
|
||||
| `Language` | Localization resources (9 languages) |
|
||||
| `CMMModel` | Data models |
|
||||
| `Tester` | Unit tests |
|
||||
Click the **Config** button next to any monitor name to customize input ports:
|
||||
|
||||
## Technical Details
|
||||
- **Custom Labels** - Rename ports (e.g., "HDMI-1" → "PC", "DisplayPort-1" → "Laptop")
|
||||
- **Hide Ports** - Remove unused ports from the dropdown
|
||||
- **Quick-Switch** - Add frequently-used ports to the toolbar for one-click switching
|
||||
- **Port Detection** - Click **Detect** to automatically discover available input ports
|
||||
|
||||
### DDC/CI Protocol
|
||||
The application uses DDC/CI (Display Data Channel/Command Interface) to communicate with monitors through the display cable. This allows software control of settings normally accessed via physical monitor buttons.
|
||||
> **Port Detection Warning:** This feature temporarily switches your monitor's input source to probe for available ports. Your screen may go dark briefly during each probe. This is safe for most monitors but should not be run repeatedly in a short time. You can cancel detection at any time.
|
||||
|
||||
### Quick-Switch Toolbar
|
||||
|
||||
After configuring ports with "Show in quick-switch toolbar" enabled, buttons will appear in the main window for instant switching between configured inputs across all monitors.
|
||||
|
||||
## Configuration
|
||||
|
||||
### Configuration Files
|
||||
|
||||
Monitor settings are stored in JSON format:
|
||||
|
||||
**Windows:** `%APPDATA%\MonitorControl\config.json`
|
||||
|
||||
### Configuration Structure
|
||||
|
||||
```json
|
||||
{
|
||||
"Monitors": [
|
||||
{
|
||||
"SerialNumber": "ABC123456",
|
||||
"MonitorName": "Dell U2720Q",
|
||||
"Ports": [
|
||||
{
|
||||
"VcpValue": 15,
|
||||
"DefaultName": "DisplayPort-1",
|
||||
"CustomLabel": "Laptop",
|
||||
"IsHidden": false,
|
||||
"ShowInQuickSwitch": true
|
||||
},
|
||||
{
|
||||
"VcpValue": 17,
|
||||
"DefaultName": "HDMI-1",
|
||||
"CustomLabel": "Desktop PC",
|
||||
"IsHidden": false,
|
||||
"ShowInQuickSwitch": true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### VCP Codes Reference
|
||||
|
||||
The application uses DDC/CI VCP (Virtual Control Panel) codes to communicate with monitors:
|
||||
|
||||
### VCP Codes Used
|
||||
| Code | Function | Values |
|
||||
|------|----------|--------|
|
||||
| `10` | Brightness | 0-100 |
|
||||
| `12` | Contrast | 0-100 |
|
||||
| `60` | Input Source | 1=VGA, 15=DP, 17=HDMI |
|
||||
| `60` | Input Source | See table below |
|
||||
| `D6` | Power Mode | 1=On, 4=Sleep, 5=Off |
|
||||
|
||||
### Input Source Values
|
||||
|
||||
| VCP Value | Input Type |
|
||||
|-----------|------------|
|
||||
| 1 | VGA-1 |
|
||||
| 2 | VGA-2 |
|
||||
| 3 | DVI-1 |
|
||||
| 4 | DVI-2 |
|
||||
| 15 | DisplayPort-1 |
|
||||
| 16 | DisplayPort-2 |
|
||||
| 17 | HDMI-1 |
|
||||
| 18 | HDMI-2 |
|
||||
|
||||
## Command-Line Options
|
||||
|
||||
The application can be controlled via command-line using `ControlMyMonitor.exe` (included in the installation):
|
||||
|
||||
### Set Brightness
|
||||
|
||||
```powershell
|
||||
ControlMyMonitor.exe /SetValue Primary 10 70
|
||||
```
|
||||
|
||||
### Set Contrast
|
||||
|
||||
```powershell
|
||||
ControlMyMonitor.exe /SetValue "ABC123456" 12 65
|
||||
```
|
||||
|
||||
### Switch Input Source
|
||||
|
||||
```powershell
|
||||
# Switch to HDMI-1
|
||||
ControlMyMonitor.exe /SetValue "\\.\DISPLAY1\Monitor0" 60 17
|
||||
|
||||
# Switch to DisplayPort-1
|
||||
ControlMyMonitor.exe /SetValue Primary 60 15
|
||||
```
|
||||
|
||||
### Power Control
|
||||
|
||||
```powershell
|
||||
# Turn on
|
||||
ControlMyMonitor.exe /TurnOn Primary
|
||||
|
||||
# Turn off (some monitors use 4 instead of 5)
|
||||
ControlMyMonitor.exe /SetValue Primary D6 5
|
||||
|
||||
# Sleep
|
||||
ControlMyMonitor.exe /SetValue Primary D6 4
|
||||
```
|
||||
|
||||
### Get Current Value
|
||||
|
||||
```powershell
|
||||
# Get brightness (returns value as exit code)
|
||||
ControlMyMonitor.exe /GetValue Primary 10
|
||||
echo %errorlevel%
|
||||
```
|
||||
|
||||
### Switch Between Values
|
||||
|
||||
```powershell
|
||||
# Toggle between 30%, 50%, and 90% brightness
|
||||
ControlMyMonitor.exe /SwitchValue Primary 10 30 50 90
|
||||
|
||||
# Toggle monitor on/off
|
||||
ControlMyMonitor.exe /SwitchValue Primary D6 1 5
|
||||
```
|
||||
|
||||
### Export/Import Settings
|
||||
|
||||
```powershell
|
||||
# Save current monitor settings
|
||||
ControlMyMonitor.exe /SaveConfig "c:\backup\monitor.cfg" Primary
|
||||
|
||||
# Load saved settings
|
||||
ControlMyMonitor.exe /LoadConfig "c:\backup\monitor.cfg" Primary
|
||||
```
|
||||
|
||||
### Monitor Identifiers
|
||||
|
||||
You can use several identifiers in place of `Primary`:
|
||||
|
||||
- `Primary` - Primary monitor
|
||||
- `Secondary` - Secondary monitor
|
||||
- `"ABC123456"` - Serial number
|
||||
- `"\\.\DISPLAY1\Monitor0"` - Device path
|
||||
- `"22EA53"` - Monitor name
|
||||
|
||||
To find your monitor's identifier, open the control panel and press `Ctrl+M` (if supported by the full WPF application).
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Error 0xc0262582 / 0xc0262583
|
||||
|
||||
These errors indicate Windows cannot communicate with your monitor via DDC/CI. Try these solutions:
|
||||
|
||||
1. **Update Graphics Driver** - Ensure you have the latest driver from your GPU manufacturer
|
||||
2. **Try Different Cable/Port** - Switch between VGA, DVI, HDMI, or DisplayPort
|
||||
3. **Remove KVM Switch** - Connect monitor directly to the computer
|
||||
4. **Enable DDC/CI in Monitor OSD** - Some monitors have a setting to enable/disable DDC/CI
|
||||
5. **Check Windows Display Settings** - Ensure the monitor is properly detected
|
||||
|
||||
### Monitor Not Detected
|
||||
|
||||
- Verify your monitor supports DDC/CI (check manufacturer specifications)
|
||||
- Laptop internal displays often do not support DDC/CI
|
||||
- Some USB-C/Thunderbolt adapters may not support DDC/CI passthrough
|
||||
|
||||
### Commands Not Working After Sleep/Resume
|
||||
|
||||
The application automatically detects system resume and enforces an 8-second grace period before sending DDC/CI commands. This prevents scaler lockout on monitors that need time to fully wake up.
|
||||
|
||||
### Slow Response or Timeouts
|
||||
|
||||
- DDC/CI communication can be slow (50-100ms per command)
|
||||
- Multiple monitors increase total response time
|
||||
- Some monitors have slower DDC/CI implementations
|
||||
- If timeouts occur frequently, the application will automatically back off for 3 seconds
|
||||
|
||||
### Debug Logging
|
||||
|
||||
If the control panel takes more than 3 seconds to load, a **Show Log** button will appear. Click it to view detailed debug information including:
|
||||
|
||||
- Monitor detection results
|
||||
- DDC/CI command timing
|
||||
- Error messages and stack traces
|
||||
|
||||
Log files are saved to: `%TEMP%\CMM\debug.log`
|
||||
|
||||
## Credits
|
||||
|
||||
- **Original Project**: [rictirse](https://github.com/rictirse) - ControlMyMonitorManagement base
|
||||
- **DDC/CI Engine**: [Nir Sofer](https://www.nirsoft.net/utils/control_my_monitor.html) - ControlMyMonitor (freeware)
|
||||
- **Enhancements**: David H Friedel Jr - UI improvements, input switching, localization
|
||||
- **Enhancements**: David H Friedel Jr - System tray UI, input switching, port configuration, quick-switch toolbar, localization, update checker, DDC/CI reliability improvements
|
||||
|
||||
## License
|
||||
|
||||
MIT License - See [LICENSE](LICENSE) for details.
|
||||
|
||||
Note: ControlMyMonitor.exe is freeware by Nir Sofer (free distribution, no modification).
|
||||
**Note:** ControlMyMonitor.exe is freeware by Nir Sofer (free distribution, no modification). The original ControlMyMonitorManagement code by DangWang has no explicit license. New contributions (system tray application, port configuration, quick-switch, DDC/CI improvements) are MIT licensed.
|
||||
Reference in New Issue
Block a user