换壁纸在个人 Mac 上是小事,在公司电脑上却经常翻车:系统设置改了没反应,第三方工具报错或静默失败,桌面还是 IT 推的那张图。
根因多半不是 App「写错了」,而是 系统壁纸被 MDM / 配置描述文件锁住 ------com.apple.desktop 一类偏好被强制,应用层去设壁纸要么失败,要么被策略盖回去。失败时桌面往往 没有任何可见变化,录屏也看不出问题。
我用 Swift + AppKit 做了个菜单栏小工具 Ink Paper:能写系统就写系统;写不进就用桌面底层全屏窗口兜底,并尽量不抢 Dock / 菜单栏 / 桌面图标的点击。
- 开源 MIT
- 安装包约 2MB(原生,非 Electron)
- 无广告、无账号、无在线图库
- v1 只做本地静态图 + 多屏
- 但是求赞助
GitHub:github.com/suilang/ink...
避雷:我只是新建了一个全屏窗口(实在不行,开个全屏浏览器占位也能养眼),并不是试图修改电脑限制策略,如果公司强制不允许壁纸被任何窗口遮挡,请勿使用本软件
设计:两套互斥模式
| 模式 | 做法 | 何时用 |
|---|---|---|
| 系统壁纸 | 走 macOS 静态壁纸 API | 环境可写时,行为最「正统」 |
| 底层窗口 | 每块屏一个桌面层级全屏 NSWindow 铺图 |
系统不可写 / 锁定时兜底 |
原则:
- 优先系统,失败再降级(可自动,也可手动强制)
- 模式互斥,切换尽量可回滚(切换前可备份系统壁纸)
- 兜底窗口不抢交互:不当 Key Window、点击穿透、层级在桌面层
- 一屏一窗,跟随屏幕插拔与分辨率变化重建
设置里的「模式」页会直接展示策略状态。例如锁定时会出现「已锁定(MDM)」,并提示自动模式下会改用底层窗口。
使用上的一个小约定
选图 ≠ 启用。
- 「选择图片」只准备资源,桌面不变
- 打开「启用壁纸」才真正铺到桌面
- 停用不会删已选图
避免「点一下就改了却不知道怎么关」。

菜单栏提供启用 / 更新 / 停用;设置里还有诊断页,可跑健康检查并复制报告,方便在托管环境里排查。
为什么刻意做小
壁纸工具很容易做成「平台」:动态壁纸、网页壁纸、图库、账号......对我这个需求(换张静图)来说太重。
Ink Paper 想对比的是:
- 包体:约 2MB 级原生客户端
- 干净:无广告、无捆绑
- 兜底:系统写不进还有第二条路
- 边界清晰:不做视频 / 动态 / 跨平台 / 在线图库(至少 v1 不做)
技术栈选 Swift/AppKit,主要是为了窗口层级、多屏和性能可控;
最低系统:macOS 13.0。
适合 / 不适合
适合: 托管 Mac 改不了壁纸;想要可审计的本地小工具;多屏静态图。
不适合: 要动态/视频/网页壁纸;要 Windows;要壁纸社区和轮播调度。
已知限制:外接屏 × 任务控制会闪
如果开着外接显示器 ,在底层窗口模式下进入 任务控制(Mission Control) ,壁纸可能会闪一下。这是 macOS 多屏合成任务控制时的系统行为,目前无解。
临时建议(应用支持按显示器分别设置):
- 只给内屏设壁纸,外接屏不铺底层窗口;或
- 只用外接屏(合盖 / 只给外屏设图),避免内屏与外屏同时走底层窗口
系统壁纸模式不受影响;闪的问题主要出现在「内屏 + 外接同时 overlay」的场景。
最后
Ink Paper 还很早期。若你在真实 MDM 环境里踩到奇怪策略,欢迎提 Issue,或把诊断页报告贴出来------这类反馈比空泛的功能许愿有用。
如果这篇文章对你有帮助,欢迎点赞 / 收藏;有 Swift / macOS 窗口层级相关的坑,也欢迎评论区一起聊。