调用ControlMyMonitor工具调节亮度与变换信号
在多设备共用一套显示器的场景下频繁手动切换信号源和调节亮度是一件繁琐且打断工作流的事情。比如主机和笔记本通过KVM共用显示屏每次切换设备往往需要按显示器的实体键操作零散、体验割裂。本方案基于AutoHotkey v2.0和ControlMyMonitor工具通过简单的快捷键组合实现对多台显示器的一键信号切换和亮度同步调节。适用环境Windows AutoHotkey v2.0 ControlMyMonitor功能一键切换信号源、长按调节亮度、亮度自动记忆难度⭐⭐只需改几个路径参数无需编程基础 一、这个脚本能干什么操作快捷键效果 切换信号源ScrollLock F12显示器切换信号☀️ 增加亮度长按ScrollLock Pause同步提亮 降低亮度长按ScrollLock PrintScreen同步降亮⚙️ 设置初始亮度Pause PrintScreen弹窗输入亮度值✅ 亮度自动保存下次开机自动恢复✅ 长按亮度分两档速度前7步慢调防手抖7步后快调省时间 二、使用前准备1. 下载两个工具工具下载地址说明AutoHotkey v2.0https://www.autohotkey.com/脚本运行环境ControlMyMonitorhttps://www.nirsoft.net/utils/control_my_monitor.html显示器控制工具不会科学上网的也可以自己找资源。2. 解压 ControlMyMonitor把ControlMyMonitor.exe放到你喜欢的位置比如E:\ControlMyMonitor\ControlMyMonitor.exe 三、找到你的显示器ID必须做每个显示器的”身份证号”不同需要先查出来。步骤打开ControlMyMonitor.exe看上半部分的显示器列表类似这样\\.\DISPLAY1\Monitor0\\.\DISPLAY2\Monitor0\\.\DISPLAY1\Monitor1把你看到的ID记下来后面要填进脚本里。两台显示器分别处于不同模式下如扩展、仅在2上显示显示器ID会变化需要记录下来。 如果只显示一个显示器检查显示器连接或者点File → Rescan Monitors✏️ 四、修改脚本参数只需改这几处打开脚本找到最上面的这几行改成你自己的exePath : E:\ControlMyMonitor\ControlMyMonitor.exe ; ← 改成你的exe路径; 改成你查到的三个显示器IDmonitorA : \\.\DISPLAY1\Monitor0monitorB : \\.\DISPLAY2\Monitor0monitorC : \\.\DISPLAY1\Monitor1SendSwitchAll(7, 切换到主机) ← 这是你传入的信号如下图小方框的内容。不同显示器输出的信号不同。假设你的两台电脑A(插DP)信号为7另一个B(插typeC)为17。A切到B应该填17。可以在ControlMyMonitor.exe改值试试。⚠️ 只用拓展只有两个显示器ID删掉 monitorC 的那行并把下面代码里所有monitorC的行也删掉。 五、运行脚本双击.ahk脚本文件任务栏右下角出现绿色 H 图标 运行成功试试按ScrollLock Pause看亮度有没有变化 六、功能详解 信号源切换 —ScrollLock F12怎么按按住ScrollLock不松再按F12干嘛用三个显示器一起切换到主机信号VCP代码7提示屏幕会弹出”切换到主机”提示1.2秒后自动消失 如果 F12 有别的功能比如浏览器开发者工具脚本不影响它单独使用。☀️ 亮度调节 — 长按ScrollLock PrintScreen/Pause怎么按按住ScrollLock不松再按住PrintScreen降亮或Pause提亮调速机制前7 次调节 → 每次间隔 200ms慢慢来防手抖跳太多第8 次开始 → 每次间隔 100ms加速快速到位提示屏幕实时显示”亮度 XX” 松开按键即停止想调多少调多少。⚙️ 设置初始亮度 —Pause PrintScreen怎么按同时按Pause和PrintScreen干嘛用弹出一个输入框输入想要的亮度值0-100留空保持当前亮度不变输入立即跳到指定亮度并自动保存 以后每次开机都会自动恢复你设置的这个亮度。 七、常见问题❓ 按了没反应检查脚本是否在运行任务栏绿色 H 图标检查显示器ID是否写对了检查exePath路径是否正确试试手动打开ControlMyMonitor.exe能否正常操作❓ 只有一个显示器变了检查三个monitorA/B/C是不是都写对了用ControlMyMonitor手动测一下每个显示器的VCP代码10是否可用❓ 想改成其他信号源修改这行里的数字SendSwitchAll(7, 切换到主机)常见VCP信号源值15DisplayPort17HDMI❓ 不想三个显示器同步删掉不需要的monitor行以及SetBrightness和SendSwitchAll里对应的Run行 八、开机自启可选使用Compile打包选中的.ahk脚本文件生成.exe文件。exe文件运行不需要额外配置可以再不同电脑上运行。打包可能要科学上网没有的话使用.ahk脚本文件也可以只是麻烦点Win R输入shell:startup回车把脚本的快捷方式拖进去下次开机自动运行 完整脚本#Requires AutoHotkey v2.0 exePath : E:\ControlMyMonitor\ControlMyMonitor.exe brightnessCode : 10 ; 亮度VCP代码 sourceCode : 60 ; 信号源VCP代码 configFile : brightness_config.txt ; 三个显示器 monitorA : \\.\DISPLAY1\Monitor0 monitorB : \\.\DISPLAY2\Monitor0 monitorC : \\.\DISPLAY1\Monitor1 ; 加载保存的亮度 LoadBrightness() { global currentBrightness try { content : FileRead(configFile) if (content ! ) { savedValue : Integer(content) if (savedValue 0 and savedValue 100) { currentBrightness : savedValue return true } } } catch { ; 文件不存在或读取失败 } return false } ; 保存亮度到文件 SaveBrightness() { global currentBrightness try { FileDelete(configFile) } FileAppend(currentBrightness, configFile) } ; 默认初始亮度 if !LoadBrightness() { currentBrightness : 10 } ; 设置亮度三个显示器同步 SetBrightness(value) { global currentBrightness value : Min(Max(value, 0), 100) if (value currentBrightness) { return } currentBrightness : value Run(exePath /SetValue monitorA brightnessCode value, , Hide) Sleep 50 Run(exePath /SetValue monitorB brightnessCode value, , Hide) Sleep 50 Run(exePath /SetValue monitorC brightnessCode value, , Hide) ToolTip(亮度 value) SetTimer(() ToolTip(), -800) SaveBrightness() } ; 调节亮度 AdjustBrightness(delta) { global currentBrightness newValue : currentBrightness delta SetBrightness(newValue) } ; 切换信号源三个显示器同步 SendSwitchAll(value, tip) { Run(exePath /SetValue monitorA sourceCode value, , Hide) Sleep 100 Run(exePath /SetValue monitorB sourceCode value, , Hide) Sleep 100 Run(exePath /SetValue monitorC sourceCode value, , Hide) ToolTip(tip) SetTimer(() ToolTip(), -1200) } ; 手动输入初始亮度 SetInitialBrightness() { global currentBrightness userInput : InputBox(请输入初始亮度值 (0-100)n如果留空则使用默认值 10, 初始亮度设置, , 10) if (userInput.Result Cancel or userInput.Value ) { ToolTip(保持当前亮度: currentBrightness) SetTimer(() ToolTip(), -1200) } else { newValue : Min(Max(Integer(userInput.Value), 0), 100) SetBrightness(newValue) ToolTip(初始亮度已设置为: newValue) SetTimer(() ToolTip(), -1200) } } ; 快捷键 ; 切换信号源ScrollLock F12 → 切换到主机 ~ScrollLock:: { ih : InputHook(V T1, {F12}) ih.Start() ih.Wait() if (ih.EndKey F12) { SendSwitchAll(7, 切换到主机) } } ; 降低亮度ScrollLock PrintScreen长按 ScrollLock PrintScreen:: { stepCount : 0 while GetKeyState(PrintScreen, P) { stepCount AdjustBrightness(-1) if (stepCount 7) { Sleep(200) } else { Sleep(100) } } } ; 增加亮度ScrollLock Pause长按 ScrollLock Pause:: { stepCount : 0 while GetKeyState(Pause, P) { stepCount AdjustBrightness(1) if (stepCount 7) { Sleep(200) } else { Sleep(100) } } } ; 设置初始亮度 Pause PrintScreen:: SetInitialBrightness() PrintScreen Pause:: SetInitialBrightness()1.代码如此麻烦是由于/GetValue获取不到当前数据只好退而求其次之。2.遇到问题问问ai基本上问题都能解决。3.两机都要切换信号需要两份代码。