Obtendo o fundo do desktop no Mac
-
08-07-2019 - |
Pergunta
Como faço para obter o papel de parede atual em um Mac? Apenas me aponte para uma função API para que eu possa Google mais.
Edit: Eu acho que eu encontrei. [NSUserDefaults standardUserDefaults] mencionado em http://lists.apple.com /archives/student-dev/2004/Aug/msg00140.html
Também é possível a partir de shell: defaults ler fundo com.apple.desktop
E a partir AppleScript: http://discussions.apple.com/thread.jspa?messageID=7111272
Solução
Atualizado Resposta (Mavericks e mais novos)
A partir do Mavericks, a Apple escreve as imagens de desktop para
/Users/<current-user>/Application Support/Dock/desktoppicture.db
que é um banco de dados SQLite. Você pode abrir este arquivo no terminal como este
sqlite3 "/Application Support/Dock/desktoppicture.db"
e, em seguida, execute o seguinte 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 ;
A saída será
<UID1>|<UID2>|<PicturePath>
<UID1>|<UID2>|<PicturePath>
:
UID1
é a UID de uma tela (por exemplo, a exibição do seu MacBook, um monitor externo, etc. como cada tela pode ter uma imagem de fundo próprio), UID2
é opcional (por vezes está faltando, o que provavelmente significa que todos os espaços de que visor) e é o UID de um espaço (cada visualização no oS X pode ter vários espaços e cada espaço pode ter um próprio fundo iamge) e <PicturePath>
é o caminho para a imagem (para este espaço específico sobre esta exibição específico).
Claro que você pode vincular sua App contra a biblioteca SQLite e fazer tudo isso com chamadas de biblioteca, mas como usar SQLite e a sintaxe SQL para consultas e atualização de dados são, naturalmente, muito além do escopo deste . resposta ??em> Apenas uma dica:. Você sair do cliente sqlite
por .exit
digitação (! observe o período anterior) e tecle enter (CTRL + C não vai funcionar)
Apenas mais uma nota: Você pode atualizar o banco de dados em seu aplicativo, mas isso não terá nenhum efeito como o Dock não vai saber sobre isso (você alterá-la nas suas costas). Para tornar o Dock consciente de que a mudança, você tem matá-lo como killall Dock
, pode ser suficiente para apenas Hup-lo (killall -HUP Dock
), que realmente não vai matá-lo (eu não testei isso). Dentro de um aplicativo, você teria que encontrar o ID do processo do Dock e enviá-lo um sinal (este é o mesmo que killall
faz), ficando IDs de processo e envio de sinais também é além do escopo dessa resposta.
Legado Resposta (Lion e anteriores)
Você está no caminho certo. Se você escrever uma aplicação em Carbon / cacau, basta carregar o arquivo de preferência. Ele está localizado no
/Users/<current-user>/Library/Preferences/com.apple.desktop.plist
O dicionário contém um sub-dicionário com a default
chave e esta sub dicionário contém um ImageFilePath
chave, que contém o caminho absoluto para o arquivo de imagem.
Outras dicas
Você pode fazê-lo com casca + Applescript assim:
#!/bin/bash
osascript -e 'tell app "finder" to get posix path of (get desktop picture as alias)'