2011-09-25 80 views
15

我想在屏幕上更改所有桌面(以前的「空格」)的壁紙。從OS X 10.6開始,有一個允許設置壁紙的NSWorkspace類別,但是,當我使用此功能時,只有當前桌面的壁紙發生變化,其他所有桌面保持不變。更改OS X 10.7 Lion中所有桌面上的壁紙?

然後,我看了桌面偏好plist並編寫了一個類,修改它以反映我想要的更改(基本上設置了一個新的圖像文件路徑)。新文件保存後,我發送了com.apple.desktop「BackgroundChanged」通知 - 谷歌如果你不知道我在說什麼,這是人們在10.6天前更換壁紙的方式。起初,這並沒有產生任何結果,所以不是「無」作爲userInfo字典,我發送完全相同的userInfo字典一樣,當你在你的設置中更改壁紙時,蘋果會做的(訂閱通知在應用程序中,並更改壁紙在設置應用程序中,你會看到它的樣子)。幸運在這裏幫助了我,當我以這種方式發送通知時出於某種原因Dock發生崩潰並且重新加載時,它會從首選項文件加載設置,從而顯示我的更改。

這可以在10.7.1上運行,但是,我會a)寧願沒有糟糕的塢站崩潰和重新加載的用戶體驗,以及b)使用或多或少保證在未來版本中工作的路徑。利用一個錯誤似乎不是一條穩定的路徑。

有關如何更改所有桌面牆紙的其他想法?我也不確定目前的NSWorkspace壁紙類別的行爲是打算還是錯誤的,但是,從壁紙偏好窗格的行爲來看,前者似乎是這樣。

回答

7

沒有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; 
} 
+0

感謝valexa,ActiveSpaceChanged通知實際上是我現在最終使用的。雖然有效,但它不像只能用一個命令設置它們那麼優雅 – Robin