如何在OS X 10.7 Lion中更改所有桌面的壁纸?

16
我想改变屏幕上所有桌面(以前称为“Spaces”)的壁纸。从OS X 10.6开始,NSWorkspace有一个类别可以设置壁纸,但是当我使用此函数时,只会更改当前桌面的壁纸,而其他所有桌面保持不变。
然后我查看了桌面首选项plist并编写了一个类来修改它,以反映我想要的更改(基本上是设置新的图像文件路径)。保存新文件后,我发送了com.apple.desktop“BackgroundChanged”通知-如果您不知道我在说什么,请搜索一下Google,这是人们在10.6之前更改壁纸的方法。起初这没有产生任何结果,因此我不是用“nil”作为userInfo字典,而是像Apple在设置中更改壁纸时一样,发送完全相同的userInfo字典(在应用程序中订阅通知并在设置应用程序中更改壁纸,你将看到它是什么样子的)。运气在这里帮了我,当我以这种方式发送通知时,Dock出现了故障,重新加载时,它从首选项文件中加载设置,从而显示我的更改。
这适用于10.7.1,但是我a)宁愿不要有Dock崩溃和重新加载的不良用户体验,b)使用更或多或少保证在未来版本中适用的路径。利用漏洞似乎不是一条稳定的道路。
有关如何更改所有桌面壁纸的其他想法吗?我也不确定NSWorkspace壁纸类别的当前行为是否是故意的或是一个错误,但是从壁纸首选项窗格的行为来看,似乎前者才是正确的。
1个回答

8

没有统一设置所有屏幕或所有空间相同壁纸的API,NSWorkspace setDesktopImageURL仅为当前屏幕上的当前空间设置壁纸,这也是“系统偏好设置”所采用的方法。

除了手动修改~/Library/Preferences/com.apple.desktop.plist(格式可能会改变)并使用通知重新加载它(你体验过的崩溃)的易变方法外,你可以在用户切换到空间时将壁纸设置为该空间,例如查找NSWorkspaceActiveSpaceDidChangeNotification(如果你的应用程序不总是运行,你可以告诉用户切换到他想应用壁纸的所有空间),可以说这些方法并不理想,但至少它们不是易变的。

-(void)setWallpaper
{
    NSWorkspace *sws = [NSWorkspace sharedWorkspace];
    NSURL *image = [NSURL fileURLWithPath:@"/Library/Desktop Pictures/Andromeda Galaxy.jpg"];
    NSError *err = nil;
    for (NSScreen *screen in [NSScreen screens]) {
        NSDictionary *opt = [sws desktopImageOptionsForScreen:screen];        
        [sws setDesktopImageURL:image forScreen:screen options:opt error:&err];
        if (err) {
            NSLog(@"%@",[err localizedDescription]);
        }else{
            NSNumber *scr = [[screen deviceDescription] objectForKey:@"NSScreenNumber"];
            NSLog(@"Set %@ for space %i on screen %@",[image path],[self spaceNumber],scr);
        }
    }
}

-(int)spaceNumber
{
    CFArrayRef windowsInSpace = CGWindowListCopyWindowInfo(kCGWindowListOptionAll | kCGWindowListOptionOnScreenOnly, kCGNullWindowID);      
    for (NSMutableDictionary *thisWindow in (NSArray *)windowsInSpace)    {
        if ([thisWindow objectForKey:(id)kCGWindowWorkspace]){
            return [[thisWindow objectForKey:(id)kCGWindowWorkspace] intValue];
        }
    }
    return -1;
}

谢谢,valexa。目前我使用的是ActiveSpaceChanged通知。虽然可以工作,但不如只需一个命令就能设置它们那样优雅。 - Robin

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