5

如何在 Mac 上获取当前壁纸?只需将我指向一个 API 函数,以便我可以搜索更多内容。

编辑:我想我找到了。[NSUserDefaults standardUserDefaults] 在http://lists.apple.com/archives/student-dev/2004/Aug/msg00140.html中提到

也可以从 shell:默认读取 com.apple.desktop 背景

并来自 AppleScript: http ://discussions.apple.com/thread.jspa?messageID=7111272

4

2 回答 2

6

更新的答案(小牛队和更新)

从 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 不会知道它(您在其背后更改它)。为了让 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,其中包含图像文件的绝对路径。

于 2008-11-19T11:04:09.153 回答
1

您可以像这样在 shell + Applescript 中执行此操作:

#!/bin/bash
osascript -e 'tell app "finder" to get posix path of (get desktop picture as alias)'
于 2015-06-10T10:12:34.643 回答