在Mac上获取桌面背景

5

在Shell中执行defaults.read...命令会产生“(com.apple.desktop,Background)的域/默认对不存在”的错误提示。 - user1934428
2个回答

6

更新的答案(适用于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,其中包含图像文件的绝对路径。

这个文件在OS 10.10(以及可能更早的版本)上已不再使用。 - Gavin S. Yancey
@g.rocket 感谢您告诉我。我已相应更新了答案。 - Mecki

1

你可以像这样在shell + Applescript中完成它:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接