在多设备共用一套显示器的场景下,频繁手动切换信号源和调节亮度是一件繁琐且打断工作流的事情。比如主机和笔记本通过KVM共用显示屏,每次切换设备往往需要按显示器的实体键,操作零散、体验割裂。
本方案基于AutoHotkey v2.0和ControlMyMonitor工具,通过简单的快捷键组合,实现对多台显示器的一键信号切换和亮度同步调节。
适用环境:Windows + AutoHotkey v2.0 + ControlMyMonitor
功能:一键切换信号源、长按调节亮度、亮度自动记忆
难度:⭐⭐(只需改几个路径参数,无需编程基础)
📌 一、这个脚本能干什么?
| 操作 | 快捷键 | 效果 |
|---|---|---|
| 🔄 切换信号源 | ScrollLock + F12 | 显示器切换信号 |
| ☀️ 增加亮度 | 长按ScrollLock + Pause | 同步提亮 |
| 🌙 降低亮度 | 长按ScrollLock + PrintScreen | 同步降亮 |
| ⚙️ 设置初始亮度 | Pause + PrintScreen | 弹窗输入亮度值 |
✅ 亮度自动保存,下次开机自动恢复
✅ 长按亮度分两档速度:前7步慢调(防手抖),7步后快调(省时间)
🛠 二、使用前准备
1. 下载两个工具
| 工具 | 下载地址 | 说明 |
|---|---|---|
| AutoHotkey v2.0 | https://www.autohotkey.com/ | 脚本运行环境 |
| ControlMyMonitor | https://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\Monitor0"monitorB := "\\.\DISPLAY2\Monitor0"monitorC := "\\.\DISPLAY1\Monitor1"SendSwitchAll(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信号源值:
15=DisplayPort,17=HDMI
❓ 不想三个显示器同步?
- 删掉不需要的
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.两机都要切换信号,需要两份代码。