是否可以(以编程方式)为macOS中的每个单独"空间" /桌面设置壁纸?

时间:2017-09-05 10:18:04

标签: swift macos cocoa nsworkspace macos-high-sierra

我为自己制作了一个小应用程序,定期更改桌面背景图像。

我的程序包含以下代码块:

let screen = NSScreen.main()!
let newWallpaperURL = URL(/* ... */)
// ...
try! NSWorkspace.shared().setDesktopImageURL(newWallpaperURL, for: screen, options: [:])

这是有效的,但仅适用于当前的#34;空间"键盘专注于。

e.g。如果我在全屏应用中,只会更改Space占用的全屏应用的背景(而不是我普通桌面的背景)。 如果我有两个Spaces / desktops,它只会改变其中一个的背景图像。

是否可以通过编程方式为每个空格单独设置壁纸?

2 个答案:

答案 0 :(得分:0)

您可以获取所有屏幕并设置所有屏幕。

let screens = NSScreen.screens
let newWallpaperURL = URL(/* ... */)
for i in screens {
    try! NSWorkspace.shared().setDesktopImageURL(newWallpaperURL, for: i, options: [:])
}

答案 1 :(得分:0)

在Xcode 8.x中使用它:

if let screens = NSScreen.screens() {
    let newWallpaperURL = URL(/* ... */))
    for screen in screens {
        try? NSWorkspace.shared().setDesktopImageURL(newWallpaperURL, for: screen, options: [:])
    }
}

与此处发布的其他解决方案不同,此版本适用于当前的Xcode 8. NSScreen.screens是Xcode 9中的类var (目前是测试版),但是类func 在Xcode 8中,这就是你需要放.screens()而不是.screens的原因。此外,screens返回一个可选项,因此您需要在将其传递给for循环之前安全地展开它。