【问题标题】:Redraw desktop background without restarting dock in OS X在 OS X 中重绘桌面背景而不重新启动扩展坞
【发布时间】:2016-04-09 01:10:34
【问题描述】:

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

- (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");)。这以某种方式重新绘制了两者之间的壁纸。但这会导致所有应用程序的所有最小化窗口都未最小化,这对我的使用来说是不合适的。有没有其他方法可以加强更新?

【问题讨论】:

  • 作为一个简单的解决方案,您可以使用AppleScript:tell application "Finder" to set desktop picture to "<file name>" as alias。请参阅this answer,了解如何在您的应用程序中包含 AppleScript。本文档中更详细的方法:developer.apple.com/library/mac/technotes/tn2084/_index.html
  • 这让我印象深刻,最好在 Apple 上提交错误并让他们修复它;这是他们的错误。
  • @Monolo 这样做了,没有帮助。同样的场景。
  • 似乎别名文件 ref 在 El Capitan 中对此不起作用。请参阅我的答案以了解适合我的方法。
  • 您找到解决方案了吗?我什至无法让 persistentDomainForName("com.apple.desktop") 返回非零值。

标签: objective-c xcode macos cocoa


【解决方案1】:

作为一种解决方法,您可以考虑使用 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。

【讨论】:

  • 这没有帮助。仍然存在相同的情况,如果我在全屏应用程序中工作,则不会呈现壁纸更改。
猜你喜欢
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多