代码之家  ›  专栏  ›  技术社区  ›  John Gallagher

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

  •  2
  • John Gallagher  · 技术社区  · 15 年前

    我正在开发一个cocoa/objective c应用程序,它使用appscript从任何应用程序中读取活动文档。我已经成功地完成了这一部分,但是能够确定应用程序是否基于文档,这将是非常好的。

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

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

    我也试过查看一些info.plist文件,但看不到任何可靠的指示。我只是不够努力吗?或者,在目标C或AppleScript中是否有一种很好的方法可以做到这一点?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Daniel Furrer    15 年前

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

        2
  •  1
  •   Adam Wright    15 年前

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

        3
  •  1
  •   Nicholas Riley    15 年前

    另一个想法是在标题栏中查找代表代理图标的最大值;无标题文档可以通过检查窗口标题中的“无标题”或其本地化等效项来匹配。

    (有些应用程序甚至包括无标题文档的代理图标,但很多没有。)