Получение фона рабочего стола на Mac
-
08-07-2019 - |
Вопрос
Как получить текущие обои на 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)'