2010-08-20 71 views
0

如何更改cocoa/objective-c中的桌面图片?我试过使用默认值,但有很多错误。更改桌面图片在objective-c

NSArray *args=[NSArray arrayWithObjects:@"write",@"com.apple.desktop", @"Background", @"'{default = {ImageFilePath = \"~/desktop.jpg\";};}'", nil]; 

NSTask *deskTask=[[NSTask alloc] init]; 

[deskTask setArguments: args]; 

[deskTask setLaunchPath:@"/usr/bin/defaults"]; 
[deskTask launch]; 
[[NSDistributedNotificationCenter defaultCenter] postNotificationName:@"com.apple.desktop" object:@"BackgroundChanged"]; 

该命令在终端中成功运行。我不需要任何人告诉我确切地说做什么,但我想一些洞察力。

编辑:我的操作系统是10.4.11

+0

那么,你有什么错误?此外,您不应该发布通知,直到值实际发生更改;这可能还没有发生,因为您在开始任务后立即发布它。你应该等待任务先完成。 (并且不要忘记在你完成任务时释放任务。) – 2010-08-21 05:54:41

+0

没有错误,但plist文件(com.apple.desktop)现在有一个元素(背景),其中包含{default = {ImageFilePath = “〜/ desktop.jpg”;};} – alexy13 2010-08-21 10:42:39

+0

plist文件的内容应该是“〜/ desktop.jpg”内嵌的ImageFilePath元素(默认元素内)。 – alexy13 2010-08-21 11:11:11

回答

3

我认为,规范的方法是使用脚本与系统事件。该AppleScript的版本是一样的东西:

tell application "System Events" 
    tell current desktop 
     set picture to (whatever) 
    end tell 
end tell 

可以使用Scripting Bridge从Objective-C的做到这一点。

+0

我忘了在我的问题中添加我的操作系统是10.4.11(不幸的是,Scripting Bridge不可用)。有没有解决方法? – alexy13 2010-08-20 18:24:34

+0

当然。改用appscript:http://appscript.sourceforge.net/ – Chuck 2010-08-20 19:15:40

+0

谢谢!我现在就试试这个。 – alexy13 2010-08-21 12:18:53

2

当您在shell中使用波形折叠压缩路径时,shell将为您扩展波形符号,因此,当您在shell中运行该命令时,将桌面图片路径设置为扩展路径(/ path/to /desktop.jpg)。当你使用NSTask时,没有外壳可以工作,所以你显示的代码将它设置为波浪线压缩路径。很少有东西期待这样的路径;他们不扩大代字号,所以它不起作用。

要使代码正常工作,需要使用NSString对象的适当方法扩展代字号,或者通过追加NSHomeDirectory()返回的路径来构造路径。

这就是说,与Chuck建议的系统事件对话是一个更好的实现方法。注意他的评论,告诉你如何在不需要Leopard的情况下做到这一点。