如何在Mac上获取当前壁纸?只需指向一个API函数,这样我就可以使用Google了。

编辑:我想我找到了。 [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

有帮助吗?

解决方案

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

从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客户端(请注意前导期间!)并按Enter键(CTRL + C将无效)。

还有一个注意事项:您可以在应用中更新数据库,但这将无效,因为Dock不会知道它(您在其背后更改它)。为了让Dock知道这个变化,你就像killall Dock一样杀了它,它可能就足够了它(killall -HUP Dock),它不会真正杀死它(我没有测试过)。在应用程序中,您必须找到Dock的进程ID并向其发送信号(这与killall相同),获取进程ID和发送信号也超出了该回复的范围。

遗留答案(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