Obtenir un fond d'écran sur Mac
-
08-07-2019 - |
Question
Comment puis-je obtenir le papier peint actuel sur un Mac? Indiquez-moi simplement une fonction API afin que je puisse utiliser davantage Google.
Edit: Je pense l’avoir trouvé. [NSUserDefaults standardUserDefaults] mentionné à l'adresse http://lists.apple.com /archives/student-dev/2004/Aug/msg00140.html
Également possible à partir du shell: lecture par défaut de com.apple.desktop Background
Et de AppleScript: http://discussions.apple.com/thread.jspa?messageID=7111272
La solution
Réponse mise à jour (Mavericks et plus récents)
À partir de Mavericks, Apple écrit les images du bureau sur
./Users/<current-user>/Application Support/Dock/desktoppicture.db
qui est une base de données SQLite. Vous pouvez ouvrir ce fichier dans Terminal comme ceci
sqlite3 "/Application Support/Dock/desktoppicture.db"
puis exécutez le SELECT suivant:
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 ;
Le résultat sera
<UID1>|<UID2>|<PicturePath>
<UID1>|<UID2>|<PicturePath>
:
UID1
est l'UID d'un écran (par exemple, l'affichage de votre MacBook, un écran externe, etc. Chaque écran pouvant avoir sa propre image d'arrière-plan), UID2
est facultatif (parfois, il manque, ce qui désigne tous les espaces de cet affichage) et il s’agit de l’UID d’un espace (chaque affichage sous OS X peut avoir plusieurs espaces et chaque espace peut avoir son propre arrière-plan iamge) et <PicturePath>
est le chemin de l’image (pour cet espace spécifique). sur cet affichage spécifique).
Bien sûr, vous pouvez lier votre application à la bibliothèque SQLite et faire tout cela avec des appels de bibliothèque, mais l'utilisation de SQLite et de la syntaxe SQL pour les requêtes et la mise à jour des données dépasse, bien entendu, le cadre de cette answer. Juste un conseil: vous quittez le sqlite
client en tapant .exit
(notez la période au début!) et en appuyant sur Entrée (CTRL + C ne fonctionnera pas).
Encore une remarque: vous pouvez mettre à jour la base de données dans votre application, mais cela n'aura aucun effet car le Dock ne le saura pas (vous le changez derrière son dos). Pour que le Dock soit conscient de ce changement, vous devez le tuer comme killall Dock
, cela suffit peut-être simplement pour le HUP (killall -HUP Dock
), ce qui ne le tuera pas vraiment (je n'ai pas testé cela). Dans une application, vous devez rechercher l'ID de processus du Dock et lui envoyer un signal (identique à celui utilisé par killall
). Obtenir les ID de processus et envoyer des signaux dépasse également le cadre de cette réponse.
Réponse héritée (Lion et versions antérieures)
Vous êtes sur la bonne voie. Si vous écrivez une application dans Carbon / Cocoa, chargez simplement le fichier de préférences. Il est situé dans
/Users/<current-user>/Library/Preferences/com.apple.desktop.plist
Le dictionnaire contient un sous-dictionnaire avec la clé default
et ce sous-dictionnaire contient une clé ImageFilePath
, contenant le chemin absolu du fichier image.
Autres conseils
Vous pouvez le faire en shell + Applescript comme ceci:
#!/bin/bash
osascript -e 'tell app "finder" to get posix path of (get desktop picture as alias)'