重新绘制桌面背景而不重新启动OS X中的停靠

时间:2016-01-05 09:08:05

标签: objective-c xcode macos cocoa

我正在使用以下功能更新壁纸:

- (void)updateWallpaper: (NSString *)path {
    NSError * aerror;
    NSURL *url = [[NSURL alloc] init];
    url = [NSURL fileURLWithPath:path];
    [[NSWorkspace sharedWorkspace] setDesktopImageURL:url forScreen:[NSScreen mainScreen] options:[NSDictionary dictionary] error:&aerror];
    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
    NSMutableDictionary* desktopDict = [NSMutableDictionary dictionaryWithDictionary:[defaults 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"];
        }];
    }];

    //NSLog(@"%@", desktopDict);

    [defaults setPersistentDomain:desktopDict forName:@"com.apple.desktop"];
    if ([defaults synchronize] == NO) {
        NSLog(@"synchronize failed");

    }

}

但是,在旧图像继续保留的意义上,并不总是呈现更新。我尝试了各种解决方法,我能想到的最好的办法是将图像写入每个更新的新文件(新文件路径)。这在我在桌面空间工作时有效,但如果我在其他一些全屏应用程序空间中工作则不行。解决此问题的唯一方法是重新加载停靠点(system ("/usr/bin/killall Dock");)。这以某种方式重新绘制了两者之间的壁纸。但这会导致所有应用程序的所有最小化窗口的最小化,这对我的使用是不利的。还有其他方法可以加强更新吗?

1 个答案:

答案 0 :(得分:0)

作为解决方法,您可以考虑使用AppleScript。它可能不是最优雅的解决方案,但将AppleScript集成到应用程序中是一种文档化的技术,因此它应该是安全的。

在OS X 10.11中,您可以使用一行脚本更改壁纸。请注意,您必须使用POSIX文件,别名似乎不起作用。

要从命令行进行测试,请在终端中尝试:

osascript -e 'tell application "Finder" to set desktop picture to POSIX file "<full path to image file>"'

This doc说明了如何在应用中使用AppleScript。