无缝更改Mac上所有桌面空间的壁纸,无需killall Dock

问题描述 投票:0回答:2

我想更改所有桌面上的壁纸,包括 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 等。

macos applescript
2个回答
1
投票

我明白了。

我正在循环所有可用的屏幕并使用 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
添加了相同的观察者,它会在设备唤醒后立即更新壁纸,这很酷!


0
投票

macOS Sonoma 似乎使用新的

.plist
文件来处理壁纸/屏幕保护程序相关的内容,位于
~/Library/Application Support/com.apple.wallpaper/Store/Index.plist

您可以编辑此

.plist
来实现您正在寻找的内容。

  1. 转到
    System Settings
    >
    Wallpaper
    ,并确保从您自己添加的文件夹中设置壁纸,并且“在所有空间上显示”已打开。
  2. 在终端中输入以下内容:
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

© www.soinside.com 2019 - 2024. All rights reserved.