gpt4 book ai didi

cocoa - 更改 OS X 10.7 Lion 中所有桌面上的壁纸?

转载 作者:行者123 更新时间:2023-12-03 16:02:26 26 4
gpt4 key购买 nike

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

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

这适用于 10.7.1,但是,我希望 a) 不想让扩展坞崩溃和重新加载带来糟糕的用户体验,b) 使用或多或少保证在未来版本中也能工作的路径。利用错误似乎并不是一条稳定的道路。

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

最佳答案

没有为所有屏幕或所有空间设置相同壁纸的 API,NSWorkspace setDesktopImageURL 的实现方式是仅为当前屏幕上的当前空间设置壁纸,系统偏好设置也是这样做的。

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

-(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;
}

关于cocoa - 更改 OS X 10.7 Lion 中所有桌面上的壁纸?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7547103/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com