我想更改所有桌面上的壁纸,包括 Mac 上的空间,但不需要每分钟调用
killall Dock
。 (Dock 重新启动会强制壁纸刷新)。
我有一个可以立即更改桌面壁纸的AppleScript:
tell application "System Events" to tell every desktop to set picture to wallpaperPath
但这只会更改活动空间上的壁纸(这意味着如果主桌面不活动,其背景不会改变)。
我发现了这个问题如何循环遍历所有 Mac 桌面空间,建议更新位于
~/Library/Application Support/Dock/desktoppicture.db
的 SQLite 数据库中的壁纸路径值。这会改变每个空间的壁纸,这很好,但需要使用 killall Dock
重新启动扩展坞,这是不可取的,因为它会扰乱工作流程。
我的问题是 - 有没有办法结合这两种方法?无缝更换每个桌面空间的壁纸?
如有任何建议,我们将不胜感激。我没有首选语言,可以是 C、Swift、Python、Bash、AppleScript 等。
我明白了。
我正在循环所有可用的屏幕并使用 setDesktopImageURL:forScreen:options:error::
设置壁纸for screen in NSScreen.screens {
try! NSWorkspace.shared.setDesktopImageURL(url, for: screen, options: [:])
}
这可以无缝更改壁纸,无需在所有屏幕上使用
killall Dock
,但前提是桌面是活动空间。
为了确保当我在另一个空间(通常是全屏应用程序)时更改壁纸,我在
NSWorkspace.activeSpaceDidChangeNotification
上添加了 NSWorkspace.shared.notificationCenter
的观察者,它再次设置桌面图像(使用上面的代码)。因此,每当我返回桌面时,都会调用此通知并且壁纸会无缝更新。
我什至更进一步,为
NSWorkspace.didWakeNotification
添加了相同的观察者,它会在设备唤醒后立即更新壁纸,这很酷!
macOS Sonoma 似乎使用新的
.plist
文件来处理壁纸/屏幕保护程序相关的内容,位于 ~/Library/Application Support/com.apple.wallpaper/Store/Index.plist
。
您可以编辑此
.plist
来实现您正在寻找的内容。
System Settings
> Wallpaper
,并确保从您自己添加的文件夹中设置壁纸,并且“在所有空间上显示”已打开。new_wallpaper_path="/path/to/wallpaper.jpg"; \
/usr/libexec/PlistBuddy -c "set AllSpacesAndDisplays:Desktop:Content:Choices:0:Files:0:relative file:///$new_wallpaper_path" ~/Library/Application\ Support/com.apple.wallpaper/Store/Index.plist && \
killall WallpaperAgent
GitHub 问题帮助我解决了这个问题:https://github.com/JohnCoates/Aerial/issues/1332