Domanda

Come posso ottenere lo sfondo corrente su un Mac? Fammi solo riferimento a una funzione API in modo che io possa Google di più.

Modifica: penso di averlo trovato. [NSUserDefaults standardUserDefaults] menzionato in http://lists.apple.com /archives/student-dev/2004/Aug/msg00140.html

Possibile anche dalla shell: per impostazione predefinita leggi com.apple.desktop Background

E da AppleScript: http://discussions.apple.com/thread.jspa?messageID=7111272

È stato utile?

Soluzione

Risposta aggiornata (Mavericks e più recenti)

A partire da Mavericks, Apple scrive le immagini del desktop in

/Users/<current-user>/Application Support/Dock/desktoppicture.db 

che è un database SQLite. Puoi aprire questo file in Terminale in questo modo

sqlite3 "/Application Support/Dock/desktoppicture.db"

e quindi eseguire il seguente SELECT:

SELECT display_uuid,space_uuid,value 
FROM preferences 
JOIN data ON preferences.data_id=data.ROWID 
JOIN pictures ON preferences.picture_id=pictures.ROWID
JOIN displays ON pictures.display_id=displays.ROWID 
JOIN spaces ON pictures.space_id=spaces.ROWID ;

L'output sarà

<UID1>|<UID2>|<PicturePath>
<UID1>|<UID2>|<PicturePath>
:

UID1 è l'UID di un display (ad es. il display del tuo MacBook, un display esterno, ecc. poiché ogni display può avere una propria immagine di sfondo), UID2 è facoltativo (a volte manca, che probabilmente indica tutti gli spazi di quel display) ed è l'UID di uno spazio (ogni display su OS X può avere più spazi e ogni spazio può avere un proprio iamge di sfondo) e <PicturePath> è il percorso dell'immagine (per questo spazio specifico su questo display specifico).

Naturalmente puoi collegare la tua app alla libreria SQLite e fare tutto ciò con le chiamate alla libreria, ma come usare SQLite e la sintassi SQL per le query e l'aggiornamento dei dati è, ovviamente, ben oltre lo scopo di questo risposta. Un solo suggerimento: esci dal sqlite client digitando .exit (nota il periodo iniziale!) e premi invio (CTRL + C non funzionerà).

Ancora una nota: puoi aggiornare il database nella tua app, ma ciò non avrà alcun effetto poiché il Dock non lo saprà (lo cambi dietro). Per rendere consapevole il Dock di tale modifica, è necessario ucciderlo come killall Dock, potrebbe essere sufficiente semplicemente HUP (killall -HUP Dock), il che non lo ucciderà realmente (non l'ho testato). All'interno di un'app, dovresti trovare l'ID di processo del Dock e inviargli un segnale (è lo stesso che killall), anche ottenere ID di processo e inviare segnali va oltre lo scopo di quella risposta.

Risposta legacy (Lion e precedenti)

Sei sulla strada giusta. Se scrivi un'applicazione in Carbon / Cocoa, carica semplicemente il file delle preferenze. Si trova in

/Users/<current-user>/Library/Preferences/com.apple.desktop.plist

Il dizionario contiene un sotto-dizionario con la chiave default e questo sotto-dizionario contiene una chiave ImageFilePath, contenente il percorso assoluto del file immagine.

Altri suggerimenti

Puoi farlo in shell + Applescript in questo modo:

#!/bin/bash
osascript -e 'tell app "finder" to get posix path of (get desktop picture as alias)'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top