Вопрос

Как получить текущие обои на 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

Это было полезно?

Решение

Обновленный ответ (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 (Lion и более ранние версии)

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

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

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

Другие советы

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

#!/bin/bash
osascript -e 'tell app "finder" to get posix path of (get desktop picture as alias)'
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top