Получение фона рабочего стола на Mac - PullRequest
5 голосов
/ 19 ноября 2008

Как мне получить текущие обои на Mac? Просто укажите мне функцию API, чтобы я мог больше гуглить.

Редактировать: Я думаю, что нашел это. [NSUserDefaults standardUserDefaults] упоминается в http://lists.apple.com/archives/student-dev/2004/Aug/msg00140.html

Также возможно из оболочки: по умолчанию читать com.apple.desktop Фон

И из AppleScript: http://discussions.apple.com/thread.jspa?messageID=7111272

Ответы [ 2 ]

5 голосов
/ 19 ноября 2008

Обновленный ответ (Mavericks и новее)

Начиная с Mavericks, Apple записывает изображения рабочего стола в

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

, которая является базой данных SQLite. Вы можете открыть этот файл в терминале, как это

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

и затем выполните следующую команду 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 ;

Выход будет

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

UID1 - это UID дисплея (например, дисплей вашего MacBook, внешний дисплей и т. Д., Поскольку каждый дисплей может иметь собственное фоновое изображение), UID2 является необязательным (иногда он отсутствует, который, вероятно, означает все пробелы этого дисплея), и это UID пробела (у каждого дисплея в OS X может быть несколько пробелов, и у каждого пробела может быть свой собственный фоновый образ), а <PicturePath> - путь к изображению (для этого определенного пробела на этом конкретном дисплее).

Конечно, вы можете связать свое приложение с библиотекой SQLite и делать все это с помощью библиотечных вызовов, но использование SQLite и синтаксиса SQL для запросов и обновления данных, конечно, выходит за рамки этого ответ. Только один совет: вы выходите из sqlite клиента, набирая .exit (обратите внимание на начальный период!) и нажимаете ввод (CTRL + C не работает).

Еще одно замечание: вы можете обновить базу данных в вашем приложении, но это не будет иметь никакого эффекта, так как док не узнает об этом (вы измените ее за спиной). Чтобы Dock знал об этом изменении, вы должны убить его как killall Dock, может быть достаточно просто подключить его (killall -HUP Dock), что на самом деле не убьет его (я этого не проверял). В приложении вам нужно найти идентификатор процесса Dock и отправить ему сигнал (это то же самое, что killall), получение идентификаторов процесса и отправка сигналов также выходит за рамки этого ответа.

Legacy Answer (Лев и ранее)

Вы на правильном пути. Если вы пишете приложение в Carbon / Cocoa, просто загрузите файл настроек. Он расположен в

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

Словарь содержит подсловарь с ключом default, а этот подсловарь содержит ключ ImageFilePath, содержащий абсолютный путь к файлу изображения.

1 голос
/ 10 июня 2015

Вы можете сделать это в shell + Applescript следующим образом:

#!/bin/bash
osascript -e 'tell app "finder" to get posix path of (get desktop picture as alias)'
...