更新的答案(适用于Mavericks及更高版本)
从Mavericks开始,苹果将桌面图像写入:
/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语法更新数据,当然超出了本答案的范围。只有一个提示:您可以通过键入.exit
(注意前导句点!)并按Enter键来退出sqlite
客户端(CTRL + C不起作用)。
还有一点需要注意的是:您可以在应用程序中更新数据库,但这不会产生影响,因为Dock不会知道它(您在其背后进行更改)。要使Dock知道该更改,您必须像killall Dock
那样杀死它,可能仅需HUP它(killall -HUP Dock
)即可,这不会真正杀死它(我还没有测试过)。在应用程序中,您必须找到Dock的进程ID并向其发送信号(这与killall
执行的操作相同),获取进程ID和发送信号也超出了此回复的范围。
旧版答案(Lion及更早版本)
您走上了正确的道路。如果您使用Carbon/Cocoa编写应用程序,只需加载首选项文件即可。它位于
/Users/<current-user>/Library/Preferences/com.apple.desktop.plist
字典包含一个子字典,其键为
default
,该子字典包含一个键
ImageFilePath
,其中包含图像文件的绝对路径。
defaults.read...
命令会产生“(com.apple.desktop,Background)的域/默认对不存在”的错误提示。 - user1934428