Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 在OS X 10.7 Lion中更改所有桌面上的墙纸?_Cocoa_Desktop_Wallpaper_Osx Lion - Fatal编程技术网

Cocoa 在OS X 10.7 Lion中更改所有桌面上的墙纸?

Cocoa 在OS X 10.7 Lion中更改所有桌面上的墙纸?,cocoa,desktop,wallpaper,osx-lion,Cocoa,Desktop,Wallpaper,Osx Lion,我想更改屏幕上所有桌面(以前称为“空间”)的墙纸。从OS X 10.6开始,NSWorkspace有一个允许设置墙纸的类别,但是,当我使用此功能时,只有当前桌面的墙纸被更改,而所有其他桌面保持不变 然后,我查看了desktop preferences plist并编写了一个类来修改它以反映我想要的更改(基本上是设置一个新的图像文件路径)。新文件保存后,我发送了com.apple.desktop“BackgroundChanged”通知-谷歌如果你不知道我在说什么,这就是人们在10.6天前更换壁纸

我想更改屏幕上所有桌面(以前称为“空间”)的墙纸。从OS X 10.6开始,NSWorkspace有一个允许设置墙纸的类别,但是,当我使用此功能时,只有当前桌面的墙纸被更改,而所有其他桌面保持不变

然后,我查看了desktop preferences plist并编写了一个类来修改它以反映我想要的更改(基本上是设置一个新的图像文件路径)。新文件保存后,我发送了com.apple.desktop“BackgroundChanged”通知-谷歌如果你不知道我在说什么,这就是人们在10.6天前更换壁纸的方式。起初,这并没有产生任何结果,因此,当你在设置中更改壁纸时,我发送了与苹果完全相同的userInfo字典,而不是userInfo字典(订阅应用程序中的通知并在设置应用程序中更改壁纸,你将看到它的外观)。幸运在这里帮助了我,当我出于某种原因以这种方式发送通知时,Dock崩溃了,当它重新加载时,它从首选项文件加载了设置,从而显示了我的更改

这适用于10.7.1,但是,我宁愿a)不要有坞崩溃和重新加载的糟糕用户体验,b)使用或多或少保证在未来版本中也能工作的路径。利用漏洞似乎不是一条稳定的道路


关于如何更改所有桌面的壁纸,还有其他想法吗?我也不确定NSWorkspace墙纸类别的当前行为是故意的还是一个bug,但是,从墙纸首选项窗格的行为来看,似乎是前者。

没有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通知实际上就是我现在所使用的。虽然可以工作,但它并不像仅仅用一个命令就能设置它们那样优雅