macos 原生不支持多显示器独立壁纸及按工作空间切换壁纸,但可通过 wallpaper 命令行工具 + hammerspoon 监听 space 切换并动态调用 applescript 实现该效果,同时支持按应用、时间或日出日落自动更换。
macos 原生不支持为每个显示器设置不同壁纸,也不允许为不同桌面空间(mission control 中的各个 space)单独指定壁纸。但通过组合 applescript、shell 脚本和第三方工具,可以实现「多显示器独立壁纸」+「按工作空间切换壁纸」的效果。关键在于绕过系统限制,用自动化方式在切换空间或显示器焦点变化时动态更新壁纸。
核心思路:用 Wallpaper 工具 + AppleScript 控制
推荐使用开源命令行工具 wallpaper(支持 macOS 12+,可为指定显示器设置壁纸)。它比系统自带的 `defaults write` 更可靠,且支持多屏独立设置。
- 安装:
brew install anishathalye/tap/wallpaper - 查看显示器列表:
wallpaper -l(输出类似Display 1 (1920x1080), Display 2 (2560x1440)) - 为指定显示器设图:
wallpaper -d "Display 1" /path/to/img1.jpg - 为另一显示器设图:
wallpaper -d "Display 2" /path/to/img2.jpg
模拟「按工作空间切换壁纸」:监听 Space 切换事件
macOS 不提供 Space 切换的公开 API,但可通过监听 NSWorkspace.activeSpace 的变化(需辅助功能权限)或利用 CGWindowListCopyWindowInfo 检测前台窗口所属 Space ID。更实用的方式是结合 Hammerspoon —— 它能可靠捕获 Space 切换,并触发 shell 脚本。
- 安装 Hammerspoon:
brew install --cask hammerspoon - 在
~/.hammerspoon/init.lua中添加:
-- 按 Space ID 设置对应壁纸组(例如 Space 1 → 显示器1用A图/显示器2用B图)
local spaceToWallpapers = {
[1] = {["Display 1"] = "/img/space1-left.jpg", ["Display 2"] = "/img/space1-right.jpg"},
[2] = {["Display 1"] = "/img/space2-left.jpg", ["Display 2"] = "/img/space2-right.jpg"},
}
<p>hs.spaces.watcher.new(function()
local spaceID = hs.spaces.activeSpace()
local config = spaceToWallpapers[spaceID]
if config then
for display, path in pairs(config) do
os.execute('wallpaper -d "' .. display .. '" "' .. path .. '"')
end
end
end):start()
</p>保存后在 Hammerspoon 中 reload 配置即可生效。每次切换 Space,脚本自动为各显示器加载对应壁纸。
部署和使用军舰的 macOS Automator 自动化服务集合。包含 5 个实用工作流:PDF转JPG、PNG重命名并转JPG、图像拼接、解压RAR、顺序命名图像文件。一键安装所有服务到 ~/Library/Services/ 目录。使用场景:(1) "安装我的自动化服务",(2) "部署所有 Automato...
进阶:让壁纸随当前应用/时间/日出日落自动变化
可在上述 Hammerspoon 脚本中扩展逻辑,例如:
- 用
hs.application.frontmostApplication()获取当前 App 名称,匹配预设壁纸组 - 用
os.date("*t")获取小时,夜间(20:00–6:00)自动切暗色系壁纸 - 调用 Sunrise-Sunset API 获取本地日出日落时间,实现自然光感切换
只需把 os.execute('wallpaper ...') 封装成函数,按条件调用即可。
注意事项与避坑点
以下问题常见,提前规避可省大量调试时间:
- 确保「系统设置 > 隐私与安全性 > 辅助功能」中已勾选 Hammerspoon 和 Terminal(否则无法监听 Space)
- Wallpaper 工具对图片路径含空格敏感,建议用全路径并加引号;也可先用
realpath规范路径 - 多显示器分辨率差异大时(如一台 Retina 一台非 Retina),注意图片尺寸适配,避免拉伸;可用
sips命令预处理 - 首次运行脚本前,手动在「系统设置 > 桌面与程序坞」中为所有显示器设同一张图,避免系统缓存干扰










