在Cocoa中设置所有空间的桌面背景

16

我正在编写一个小程序来更改您的桌面背景。如果用户只使用一个空间,那么一切都很好,但是当他有多个空间时,该应用程序仅在当前活动空间中工作。

我正在使用此代码

[[NSWorkspace sharedWorkspace] setDesktopImageURL:currentImageURL 
                                        forScreen:screenToChange 
                                          options:screenOptions 
                                            error:&error]

更改桌面背景很简单,但似乎没有办法更改另一个空间的背景。

我只找到了一些几年前的答案,而没有人提出这个具体问题。有没有用Objective-C实现的方法呢?


1
我也不知道答案。我自己也搜索过,但无法在Objective-C或AppleScript中始终使其正常工作。在我看来,苹果公司似乎不会向开发人员公开此功能,就像我们也无法对空格做任何事情一样。 - regulus6633
@HussainShabbir 你说得对,但我还没有时间测试这个,请再等一会儿,我现在很忙。 - XelharK
你找到了一种方法来做这件事吗? - yesthisisjoe
不幸的是,这已经是相当久以前的事了。当时我找不到任何解决方法,但现在情况可能已经有所改变。很抱歉我无法提供任何答案。 - XelharK
2个回答

6
虽然没有公共API可以更改空间背景,但有办法做到。 你需要找的关键字是com.apple.desktop.plist,它在〜/Library/Preferences/里。这个属性列表文件存储了所有当前空间的当前背景。如果你想使用Objective-C,你可以按照自己的喜好更改此文件,或者你可以使用这里这里提供的解决方案。如果你的目标是Mavericks,则壁纸数据在这里:〜/Library/Application\ Support/Dock/desktoppicture.db

我们如何更改 desktoppicture.db - Felipe

2
Setting the desktop background on all Spaces in Cocoa

如果用户想要为多个空间设置桌面背景,请尝试以下代码:-
更多信息请参见此处
NSString* path = @"/Users/abc/Desktop/yourImg.png";

NSUserDefaults* def = [NSUserDefaults standardUserDefaults];
NSMutableDictionary* desktopDict = [NSMutableDictionary dictionaryWithDictionary:[def persistentDomainForName:@"com.apple.desktop"]];
NSMutableDictionary* bgDict = [desktopDict objectForKey:@"Background"];
NSMutableDictionary* spaces = [bgDict objectForKey:@"spaces"];
[spaces enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSMutableDictionary* obj, BOOL *stop) {
    [obj enumerateKeysAndObjectsUsingBlock:^(id key, NSMutableDictionary* prefs, BOOL *stop) {
        [prefs setObject:path forKey:@"ImageFilePath"];
        [prefs setObject:path forKey:@"NewImageFilePath"];
        [prefs setObject:@"Never" forKey:@"Change"];
    }];
}];
[def setPersistentDomain:desktopDict forName:@"com.apple.desktop"];

2
这似乎在10.11上无法正常工作。尝试获取持久域“com.apple.desktop”返回nil。有什么解决方法吗? - yesthisisjoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接