无需 killall Dock 即可无缝更改 Mac 上所有桌面空间的墙纸

Seamlessly change all desktop spaces' wallpaper on Mac without killall Dock

我想更改所有桌面上的墙纸,包括 Mac 上的 spaces,但不需要每分钟调用 killall Dock。 (Dock 重启强制壁纸刷新)。

我有一个 AppleScript 可以立即更改桌面墙纸:

tell application "System Events" to tell every desktop to set picture to wallpaperPath

但这只会更改活动中的墙纸 space(这意味着如果主桌面未处于活动状态,其背景将不会更改)。

我发现了这个问题 ,它建议更新位于 ~/Library/Application Support/Dock/desktoppicture.db 的 SQLite 数据库中的墙纸路径值。这会在每个 space 更改壁纸,这很好,但它需要使用 killall Dock 重新启动扩展坞,这是不可取的,因为它会扰乱工作流程。

我的问题是 - 有什么方法可以结合这两种方法吗?无缝更改每个桌面上的壁纸 space?

如有任何建议,我们将不胜感激。我没有首选语言,可以是 C、Swift、Python、Bash、AppleScript 等

我想通了。

我正在遍历所有可用屏幕并使用 setDesktopImageURL:forScreen:options:error: 设置壁纸:

for screen in NSScreen.screens {
    try! NSWorkspace.shared.setDesktopImageURL(url, for: screen, options: [:])
}

这会无缝更改壁纸,无需在所有屏幕上 killall Dock,但前提是桌面处于活动状态 space。

为了确保在我使用另一个 space(通常是全屏应用程序)时更改壁纸,我在设置桌面的 NSWorkspace.shared.notificationCenter 上为 NSWorkspace.activeSpaceDidChangeNotification 添加了一个观察者图像再次(使用上面的代码)。因此,每当我回到桌面时,都会调用此通知并无缝更新墙纸。

我什至更进一步,还为 NSWorkspace.didWakeNotification 添加了相同的观察器,它会在设备唤醒后立即更新壁纸,这很酷!