2012-12-31 10 views
8

ich diesen Code bin mit dem aktuellen Hintergrundbild zu erhalten:Holen Sie sich das aktuelle Hintergrundbild in Cocoa

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

Dies funktioniert gut, aber wenn ich einen Ordner mit Bildern stellen Sie die Tapete sein (wie im Bild gezeigt), das imageURL ist ein Verzeichnis, also wie kann ich das USURL des gegenwärtigen Tapeten in dieser Situation erhalten?

enter image description here

+1

Ich habe https://openradar.appspot.com/radar?id=5782854294306816 geöffnet, da es besser wäre, wenn die API tat, was sie verspricht. –

Antwort

3

Ich habe versucht, die genau die gleiche Sache zu tun. Sie können die aktuelle Desktop-Bild-URL erhalten:

  1. Abrufen der aktuellen Raum UUID aus der com.apple.spaces Eigenschaftsliste,
  2. die com.apple.desktop Eigenschaftsliste für den passenden Raum Suchen,
  3. die URL aus der Eigenschaft Name VZ Extrahierung

ich noch arbeiten daran, aber der folgende Code erhält die korrekte URL ... manchmal. Das Hauptproblem besteht darin, dass die Eigenschaftslisten nicht häufig genug aktualisiert werden und ich nicht in der Lage war, sie zu zwingen, zu erneuern (kurz, das Dock zu töten). Lass es mich wissen, wenn du etwas herausgefunden hast!

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

Sie möchten '__bridge_transfer' in diesen Umwandlungen, da' CFPreferencesCopyAppValue' eine Referenz im Besitz zurückgibt. Außerdem hat NSWorkspace 'activateFileViewerSelectingURLs:', wodurch die Notwendigkeit entfällt, einen Pfad von der URL zu extrahieren, und NSURL hat 'URLByAppendingPathComponent: '. –

+1

Hat jemand eine Möglichkeit gefunden, die Eigenschaftslisten zu aktualisieren, ohne das Dock zu beenden? – scolfax

2

Es gibt einen anderen Weg, um das Bild zu erhalten, indem Sie einen Screenshot der aktuellen Tapete nehmen.

Dieser Ansatz sieht viel einfacher IMHO, wenn Sie das Bild, nicht die URL benötigen.

Beachten Sie, dass im com.apple.dektop plist kein Hintergrundbild mehr definiert ist: Ausgehend von Mavericks wird die Einstellung in ~/Library/Application Support/Dock/desktoppicture.db verschoben. Dies ist die SQLite-Datei und die Tabelle "data" enthält die URL.