macos可通过命令行与脚本实现多显示器独立壁纸及窗口布局记忆:一、用sqlite3修改desktoppicture.db并重启dock设置各屏壁纸;二、用ioreg监听显示变化,触发脚本;三、用applescript记录/恢复窗口坐标;四、可选displayplacer等开源工具简化流程。
macos 原生不支持为每台显示器设置不同壁纸,也不保存窗口在特定显示器上的位置(尤其在插拔外接屏后)。但通过组合系统命令、applescript 和轻量工具,可以实现「多显示器独立壁纸 + 窗口布局记忆」的自动化方案。关键在于分两步:壁纸控制用 defaults + sqlite3 操作桌面数据库;窗口管理依赖 yabai(需开启辅助功能)或 applescript 脚本记录/恢复应用位置。
一、为每台显示器设置独立壁纸(无需第三方 App)
macOS 12+ 将壁纸配置存储在 SQLite 数据库中(~/Library/Application Support/Dock/desktoppicture.db),每个显示器有唯一 display_id。可手动插入或更新对应记录:
- 先用
system_profiler SPDisplaysDataType | grep "Resolution\|ID:"查出各显示器的Display ID(如0x34892F00)和分辨率 - 准备两张图片路径(如
/Users/me/Pics/left.jpg和/Users/me/Pics/right.jpg) - 执行以下命令写入数据库(⚠️操作前备份
desktoppicture.db):sqlite3 ~/Library/Application\ Support/Dock/desktoppicture.db "INSERT OR REPLACE INTO data VALUES('0x34892F00', '/Users/me/Pics/left.jpg');"sqlite3 ~/Library/Application\ Support/Dock/desktoppicture.db "INSERT OR REPLACE INTO data VALUES('0x34892F01', '/Users/me/Pics/right.jpg');" - 重启 Dock:
killall Dock,壁纸即生效
二、自动识别显示器变化并触发壁纸/窗口脚本
监听显示器热插拔事件,可用 system_profiler 定期轮询,或更高效地使用 ioreg 监控显示设备变更:
- 新建脚本
~/bin/monitor-change.sh,内容如下:
#!/bin/zsh
last_count=$(system_profiler SPDisplaysDataType | grep "Resolution" | wc -l)
while true; do
sleep 2
now_count=$(system_profiler SPDisplaysDataType | grep "Resolution" | wc -l)
if [[ $now_count != $last_count ]]; then
echo "$(date): Display count changed → applying config"
~/bin/set-wallpapers.sh
~/bin/restore-windows.sh
last_count=$now_count
fi
done
- 赋予执行权限:
chmod +x ~/bin/monitor-change.sh - 用
launchd后台运行(放入~/Library/LaunchAgents/local.monitor-display.plist)
三、记录与恢复窗口位置(轻量级方案)
不依赖付费工具(如 Moom、Rectangle),可用 AppleScript 批量读取/设置主流应用窗口坐标:
- 记录当前窗口状态(保存到
~/Library/Caches/window-layout.json):osascript -e 'tell application "Finder" to get bounds of window 1'可获取坐标
对 Terminal、Safari、Chrome 等分别调用tell app "XXX"获取bounds(格式:{x, y, width, height}) - 恢复时按显示器分辨率缩放坐标(避免跨屏错位),再用
set bounds of window 1 to {x,y,w,h}写回 - 推荐封装为函数,例如:
save_layout()和load_layout(),在set-wallpapers.sh后自动调用
四、简化方案:用现成开源工具降低维护成本
若不想手写复杂逻辑,可组合以下轻量工具:
- WallpaperEngine(非 Steam 版):开源替代 johnmurray/wallpaper,支持 CLI 设置 per-display 图片
-
yabai + skhd:对窗口做空间化管理(需关闭 SIP),配合
yabai -m query --windows导出/导入布局 - displayplacer:精确控制显示器排列与缩放,常与壁纸脚本联动(github.com/jakehilborn/displayplacer)
将这些命令整合进一个主脚本(如 ~/bin/apply-display-config),再由 launchd 或显示器事件触发,即可实现接近「开箱即用」的多屏自适应体验。











