休眠之后,外接显示器亮度被重置
你把显示器调暗,合上盖子,回来一看又是亮的。或者你改了分辨率、拔插了线,同样的事情发生。系统设置里没有任何地方能把它设回去——因为系统自己也没有保存这个值。
到底发生了什么
在第三方显示器上,亮度与对比度存在显示器内部,通过 DDC/CI 访问;如果这块面板没有实现 DDC/CI,那么唯一还能控制的就是 CoreGraphics 伽马表。无论哪条路,macOS 都不会保存这个值。从休眠唤醒、改分辨率、重新插拔,都意味着显示器被重新配置,你设过的东西就这么没了——面板回到它自己的默认状态。
为什么想当然的修法没用
最自然的修法是:监听唤醒通知,然后把值写回去。这会失败,原因很具体——面板在唤醒之后需要一点时间才会回应 DDC/CI。你在通知到达的瞬间就写,这次写入会被直接丢掉。这就是为什么很多自己写的小脚本「有时候灵、有时候不灵」。
可靠的做法是:等一等(我们等 2.5 秒),再写;如果没写进去,就重试。我们的重试节奏是 1 秒、2 秒、4 秒。而且第一次尝试时面板可能根本还没出现在总线上——这不是错误,这是正常的先后顺序。
这不是推测:它是我们源码里 SelfHealEngine.wakeDelay 上的注释,也是这个功能存在的原因。
今天就能用的办法
- 在显示器自己的 OSD 里设置。由面板自己保存的值,能扛过休眠、分辨率变化和重启。
- 用一个处理了唤醒路径的免费工具。MonitorControl 做 DDC 亮度与音量,而且开源——如果你只要亮度和音量,就用它,不要给我们付钱。这话我们也写在对比页里。
- 或者让应用替你写回。DisplayPilot 会监听唤醒与显示器重配置,等待、把记住的硬件状态写回去,失败就重试。你可以关掉自动重放,只留一个「立即重放一次」按钮,把控制权握在自己手上。
如果亮度完全回不来
那是另一个故障——可能是面板没有实现 DDC/CI,也可能是线材或接口不传它。区分办法在《DDC/CI 无响应》里。