【问题标题】:Seamlessly change all desktop spaces' wallpaper on Mac without killall Dock无需 killall Dock 即可在 Mac 上无缝更改所有桌面空间的壁纸
【发布时间】:2022-01-21 11:51:44
【问题描述】:

我想更改所有桌面上的墙纸,包括 Mac 上的空间,但无需每分钟致电 killall Dock。 (Dock 重新启动会强制刷新壁纸)。

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

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

但这只会改变活动空间上的壁纸(这意味着如果主桌面不活动,则其背景不会改变)。

我发现这个问题How to loop through all Mac desktop spaces 建议更新位于~/Library/Application Support/Dock/desktoppicture.db 的SQLite 数据库中的壁纸路径值。这会更改每个空间的墙纸,这很棒,但需要使用 killall Dock 重新启动扩展坞,这是不可取的,因为它会破坏工作流程。

我的问题是 - 有没有办法将这两种方法结合起来?无缝更换每个桌面空间的壁纸?

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

【问题讨论】:

  • 实际上 - 不需要在所有空间上更改它。无论哪个空间处于活动状态(我使用全屏应用程序 - 因此每个全屏应用程序都有自己的空间),我只需要在所有主桌面(每台显示器上)上刷新壁纸。

标签: macos applescript


【解决方案1】:

我想通了。

我正在循环浏览所有可用屏幕并使用 setDesktopImageURL:forScreen:options:error: 设置壁纸:

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

这可以无缝更改壁纸,不需要在所有屏幕上都使用killall Dock,但前提是桌面是活动空间。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 2017-11-21
    • 2013-08-11
    • 2017-06-14
    • 1970-01-01
    • 2020-10-16
    相关资源
    最近更新 更多