一个外接显示器后开盖关闭 mbp 显示器的小工具

Vitta 2026-06-04 14:38 1

https://github.com/Attiv/clamOpen/tree/main


一个常驻菜单栏的小工具:在连接外接显示器时,真正关闭 MacBook 内置屏(背光熄灭、停止渲染),而盖子保持打开。效果等同合盖( clamshell ),但你仍能用摄像头、Touch ID 、键盘,散热也更好。


以前搜过好像只能用俩磁铁吸到电脑上假装合盖了,现在有一个私有的 API 可以做到


功能



  • 🖥️ 菜单栏一键开 / 关内置屏

  • 🤖 自动模式 —— 接外接屏自动关内置、拔掉自动恢复

  • 🛟 防崩溃恢复 —— 独立的「恢复内置屏」 App ,即使主程序挂了、屏幕全黑,也能用 Spotlight 盲打救回

  • 🔒 安全优先 —— 没有外接屏时拒绝关闭内置屏;拔线 / 退出自动恢复

  • 🪶 仅菜单栏(无 Dock 图标)、无后台守护进程、不永久改动系统


实现原理


ClamOpen 通过 CoreGraphics / SkyLight 的私有符号关闭内置屏:


CGError CGSConfigureDisplayEnabled(CGDisplayConfigRef config, CGDirectDisplayID display, bool enabled);

放在标准的显示器重配置事务里调用:


var config: CGDisplayConfigRef?
CGBeginDisplayConfiguration(&config)
CGSConfigureDisplayEnabled(config, builtinDisplayID, false) // false = 禁用
CGCompleteDisplayConfiguration(config, .forSession)


  • CGBeginDisplayConfiguration / CGCompleteDisplayConfiguration公开的 CoreGraphics 接口。

  • CGSConfigureDisplayEnabled 是真正干活的私有符号。通过
    dlsym(RTLD_DEFAULT, "CGSConfigureDisplayEnabled") 在运行时取得(它就在 CoreGraphics / SkyLight
    内),因此不需要链接私有框架,也不需要任何 entitlement 。

  • 之后内置屏的 CGDisplayIsActive == false:背光关闭、不再渲染 —— 视觉上和合盖一致,但盖子开着。

  • forSession 作用域表示设置只在当前登录会话有效;因此注销或重启一定会恢复内置屏


目前只在 19 款 intel mbp 上测试过,需要的可以试试

最新回复 (4)
  • Zarhani 06-04 14:43
    1
    我是自己 vibe 了 python 脚本,也是用的相同 API
  • Vitta 楼主 06-04 19:04
    2
    @Zarhani 天热刚想起来这个事。。
  • Zarhani 06-05 00:14
    3
    @Vitta 现在有个问题:接入外接显示器,然后关闭 macbook 自带屏幕后,断开外接显示器,自带屏幕不会亮起来,而是彻底黑屏;我是在 python 脚本里面加了相关逻辑,如果没有外接显示器则强制给 id 为 1 的屏幕启动,然后用 karabiner-elements 搞了个快捷键,用快捷键去调用 python 脚本
  • Vitta 楼主 06-05 10:31
    4
    @Zarhani #3 我又弄了一个唤醒的 APP 在里面,黑屏后直接唤出 raycast 盲打 唤醒回车,昨天就用到了😂
* 帖子来源V2EX
返回