GoForum🌐 V2EX

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

Vitta · 2026-06-04 14:43 · 0 次点赞 · 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 上测试过,需要的可以试试

1 条回复
Zarhani · 2026-06-04 14:48
#1

我是自己 vibe 了 python 脚本,也是用的相同 API

添加回复
你还需要 登录 后发表回复

登录后可发帖和回复

登录 注册
主题信息
作者: Vitta
发布: 2026-06-04
点赞: 0
回复: 0