macos - 在 Mac 上获取桌面背景

标签 macos wallpaper desktop-background

如何获取 Mac 上的当前壁纸?只需向我指出一个 API 函数,这样我就可以通过 Google 搜索更多信息。

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

也可以从 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 那样杀死它。 ,仅仅 HUP 它可能就足够了( killall -HUP Dock ),这不会真正杀死它(我还没有测试过)。在应用程序中,您必须找到 Dock 的进程 ID 并向其发送信号(这与 killall 的作用相同),获取进程 ID 和发送信号也超出了该回复的范围。

旧版答案(Lion 及更早版本)

您走在正确的道路上。如果您用 Carbon/Cocoa 编写应用程序,只需加载首选项文件即可。它位于

/Users/<current-user>/Library/Preferences/com.apple.desktop.plist

字典包含一个子字典,其键为 default这个子字典包含一个键 ImageFilePath ,包含图像文件的绝对路径。

关于macos - 在 Mac 上获取桌面背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/301215/

相关文章:

ios - 从 Windows PC 调用 iOS 构建

macos - 使用 PubSub 获取 Gmail 未读邮件计数

php - OpenSSL 未在 PHP 模块下列出,但显示在配置命令中

swift - 无法对 Mac 应用程序进行代码签名

html - Unblur 模糊背景 div 中的内容

cron - Pcmanfm 设置墙纸在 cron 中的 Raspbian 拉伸(stretch)上失败

batch-file - 如何在win 8中使用批处理代码更改壁纸?

python - 写入文件时出现 IOError