如何检测应用程序是否基于文档?

时间:2009-03-20 15:02:25

标签: objective-c cocoa macos

我正在开发一个Cocoa / Objective C应用程序,它使用AppScript从任何应用程序中读取活动文档。我已成功完成此部分,但能够确定应用程序是否基于文档是非常好的。

显而易见的方法是查看应用程序中活动窗口的AXDocument属性,如果它包含路径,我们知道该应用程序是基于文档的。但是,如果文档未保存,则不起作用。它也很笨拙。相反令人讨厌的是,AXDocument属性可能出现在非文档应用程序中,因此它的存在或不存在不能用于提供我寻求的信息。

我已经尝试查看AppleScript通过应用程序进程和单个窗口公开的其他属性和属性。这些项目似乎都没有告诉我这个应用程序是否基于文档。

我也尝试查看一些Info.plist文件,但看不到任何可靠的信号。我只是不够努力吗?或者在Objective C或AppleScript中有这样做的好方法吗?

3 个答案:

答案 0 :(得分:2)

根据Document-Based Application Architecture指南构建的基于文档的应用程序应满足几个条件。 我不确定是否/如何在Mac OS上访问不同的应用程序,但是使用反射(在Objective-C中),您可以测试是否存在NSDocument子类。 另一个想法是只看菜单条目......有文件 - >新的,文件 - >打开菜单条目?

答案 1 :(得分:1)

您可能希望在应用程序包的Info.plist中查找CFBundleDocumentTypes键。这通常适用于基于文档的应用程序,因此文档类型可以与扩展名和加载它的类相关联。

答案 2 :(得分:1)

另一个想法是在标题栏中查找代表代理图标的AXImage;通过检查“无标题”或其本地化等价物的窗口标题,可以简单地匹配无标题文档。

(有些应用程序确实包含代理图标,即使对于无标题文档也是如此,但许多应用程序确实没有。)