2012-12-31 13 views
8

używam tego kodu, aby uzyskać aktualną tapetę:Pobierz aktualną tapetę w Cocoa

NSURL *imageURL = [[NSWorkspace sharedWorkspace] desktopImageURLForScreen:[NSScreen mainScreen]]; 

Działa to dobrze, ale kiedy ustawić folder obrazów za tapetę (jak pokazano na rysunku), imageURL jest katalogiem, więc jak mogę uzyskać USURL obecnej tapety w tej sytuacji?

enter image description here

+1

Otworzyłem https://openradar.appspot.com/radar?id=5782854294306816, ponieważ byłoby lepiej, gdyby API zrobiło to, co obiecuje. –

Odpowiedz

3

Próbowałem zrobić dokładnie to samo. można uzyskać aktualny obraz pulpitu URL przez:

  1. Uzyskiwanie bieżącego obszaru UUID z listy nieruchomości com.apple.spaces,
  2. Przeszukiwanie com.apple.desktop wykaz nieruchomości na przestrzeni dopasowanej,
  3. Wyodrębnianie URL z właściwości LastName

ja wciąż pracuje nad tym, ale następujący kod uzyskuje prawidłowy adres URL ... czasami. Głównym problemem jest to, że listy właściwości nie są wystarczająco często aktualizowane, a ja nie byłem w stanie zmusić ich do odświeżenia (brak zabicia stacji dokującej). Daj mi znać, jeśli coś wymyślisz!

NSDictionary *spacesPLIST = (__bridge NSDictionary *)(CFPreferencesCopyAppValue(CFSTR("SpacesConfiguration"), CFSTR("com.apple.spaces"))); 
NSDictionary *desktopPLIST = (__bridge NSDictionary *)(CFPreferencesCopyAppValue(CFSTR("Background"), CFSTR("com.apple.desktop"))); 

NSArray *monitors = [spacesPLIST valueForKeyPath:@"Management Data.Monitors"]; 
NSInteger monitorIndex = 0; 
if ([monitors count] > 1) { 
    //search for main (or ask user to select) 
} 
NSDictionary *monitor = [monitors objectAtIndex:monitorIndex]; 
NSDictionary *spaces = [desktopPLIST valueForKey:@"spaces"]; 
NSString *currentSpaceUUID = [monitor valueForKeyPath:@"Current Space.uuid"]; 
NSDictionary *currentSpace = [spaces valueForKey:currentSpaceUUID]; 
NSURL *desktopPicturesDirectory = [NSURL fileURLWithPath:[currentSpace valueForKeyPath:@"default.ChangePath"] isDirectory:true]; 
NSString *desktopPictureName = [currentSpace valueForKeyPath:@"default.LastName"]; 
NSURL *desktopPictureURL = [NSURL URLWithString:desktopPictureName relativeToURL:desktopPicturesDirectory]; 
[[NSWorkspace sharedWorkspace] selectFile:[desktopPictureURL path] inFileViewerRootedAtPath:@""]; 
+0

Chcesz '__bridge_transfer' w tych rzutów, ponieważ' CFPreferencesCopyAppValue' zwraca własnością odniesienia. Ponadto, NSWorkspace ma "activateFileViewerSelectingURLs:', zwalniając potrzebę wyodrębnienia ścieżki z adresu URL, a NSURL ma 'URLByAppendingPathComponent:'. –

+1

Czy ktoś wymyślił sposób na odświeżenie list nieruchomości bez konieczności zabijania Dock? – scolfax

2

Jest inny sposób na uzyskanie obrazu, wykonując zrzut ekranu z bieżącą tapetą.

extension NSImage { 

    static func desktopPicture() -> NSImage { 

     let windows = CGWindowListCopyWindowInfo(
      CGWindowListOption.OptionOnScreenOnly, 
      CGWindowID(0))! as NSArray 

     var index = 0 
     for var i = 0; i < windows.count; i++ { 
      let window = windows[i] 

      // we need windows owned by Dock 
      let owner = window["kCGWindowOwnerName"] as! String 
      if owner != "Dock" { 
       continue 
      } 

      // we need windows named like "Desktop Picture %" 
      let name = window["kCGWindowName"] as! String 
      if !name.hasPrefix("Desktop Picture") { 
       continue 
      } 

      // wee need the one which belongs to the current screen 
      let bounds = window["kCGWindowBounds"] as! NSDictionary 
      let x = bounds["X"] as! CGFloat 
      if x == NSScreen.mainScreen()!.frame.origin.x { 
       index = window["kCGWindowNumber"] as! Int 
       break 
      } 
     } 

     let cgImage = CGWindowListCreateImage(
      CGRectZero, 
      CGWindowListOption(arrayLiteral: CGWindowListOption.OptionIncludingWindow), 
      CGWindowID(index), 
      CGWindowImageOption.Default)! 

     let image = NSImage(CGImage: cgImage, size: NSScreen.mainScreen()!.frame.size) 
     return image 
    }   
} 

To podejście wygląda na znacznie prostsze IMHO, jeśli potrzebujesz obrazu, a nie adresu URL.

Należy zauważyć, że tapeta nie jest już zdefiniowana w pliku com.apple.dektop: począwszy od Mavericks ustawienie zostanie przeniesione do folderu ~/Library/Application Support/Dock/desktoppicture.db. To jest plik SQLite, a tabela "danych" zawiera adres URL.

Powiązane problemy