我试图弄清楚Mac OSX上其他活动应用程序当前正在打开什么文件。 我知道可以通过以下方式找到当前打开的应用程序:

NSWorkspace *ws = [[NSWorkspace alloc] init];

NSArray *apps = [ws runningApplications];

// loop through the apps and get the localizedName

但是,“ runningApplications”(NSRunningApplication)无法为我提供与该应用程序中打开的内容相关的任何信息。 假设用户打开了Sublime Text 2。 我想访问该应用程序,并查看他们当前在其中打开了哪些文档(以及该文档的相关路径)。

我知道applescript和scripting bridge是“选项”,但是我看到的那些问题是以下两个:

  • Scripting Bridge要求您从要与之交互的每个应用程序中生成并添加头文件。 对我来说,这个问题是我的应用程序不知道用户预先拥有哪些应用程序 XCode(5)似乎不允许我在安装时生成这些代码(即,通过用户的应用程序目录循环并添加应用程序)或任何其他方法。

  • AppleScript虽然不依赖于知道要使用的应用程序,但并不适用于所有应用程序。 只有某些人支持。

此处的最终目标是能够查看用户当前打开了哪些应用程序,并获得有关当时这些应用程序已经打开的信息。

编辑:例如-如果用户使用“文本编辑”打开“ /some/dir/example.txt”,我希望能够获取该信息。

===============>>#1 票数:3

要实现您的要求,您需要使用多个API进行大量工作。 我们实施了此过程,并花了几个星期才能完成。 这里有一些提示:

  • 使用NSRunningApplication获取Unix-PID
  • 使用AppleScript和AXAPI来获取Windows及其文档。
unixPID = 12345  -- insert the number here
    tell application id "com.apple.systemevents"
        try
            tell (application processes where unix id is unixPID)
                with timeout of 5 seconds
                    repeat with thiWind in every window
                        set isMain to value of attribute "AXMain" of thiWind
                        if isMain then
                            return value of attribute "AXDocument" of thiWind
                            exit repeat
                        end if
                    end repeat
                end timeout
            end tell
        end try
    end tell
  • 另外,也可以使用CGWindow.h遍历所有应用程序的窗口,然后为每个应用程序使用Windows ID和特定脚本。 例如:
tell application id "com.apple.TextEdit"
    try
        set mydoc to document of window id 1234 -- insert window number here
        return path of mydoc
    end try
end tell

要查看示例, 请查看我们的应用程序 该功能确实很难维护,并且在大多数情况下都可以使用。 在“ 开发人员”部分的此页上查看应如何实施其他应用程序。

实际观看:

  • 将包含各种文档的文件夹添加到Raskin(例如单词,数字,文本,photoshop等)
  • 在他们的应用程序中打开这些文档
  • 大多数文件在打开的地方都会显示徽章
  • 然后您可以使用cmd-alt-R或cmd-alt-scroll从任何打开的文档返回Raskin的表面,以暴露此文件

在文本文档上打开徽章

===============>>#2 票数:1

您可以使用lsof (列出打开的文件)命令来获取所需的信息。 该命令将产生旨在供其他程序读取的输出,并且您可以使用NSTask / NSPipe从应用程序执行。

HTH

附录:有些东西是无价的...

我看到您开了赏金,但有些东西根本买不到...您考虑过要问什么吗?

考虑一下lsof在做什么-它正在报告操作系统为应用程序打开的文件; 应用程序本身是一个黑匣子,操作系统维护有关打开文件的信息, lsof可以访问它。

您希望查看应用程序的黑匣子,并代表用户确定应用程序知道的文件。 从OS的角度来看,这样的文件可能根本不是“打开”的-应用程序可能已经打开它,读入内容然后关闭了它。 您认为如何发现呢? 来自黑匣子?

例如, NSDocument可能被提供了这些信息,但是即使如此,您又如何从应用程序外部访问NSDocument数据结构呢? 如果应用程序不使用NSDocument怎么办?

从Apple那里获取TextEdit示例代码, 不要阅读它 在Xcode下运行它一段时间,然后打开一些文件。 现在点击调试暂停按钮。 使用调试器命令(调试器可以调用应用程序中的方法)尝试查找打开文件的列表。 您可以阅读任何需要帮助的NSDocument文档。 如果可以找到路径名,那么就可以找到解决方案的起点(以一种或多种方式,调试器可以从应用程序中进行操作,但可能并不简单)。

另一种方法:默认文件夹使用帮助程序来跟踪打开和保存对话框的使用情况。 其他程序修补其他系统API。 如果采用类似的方法,则可以设计一个帮助程序,该帮助程序可以跟踪某些NSDocument API的使用并以此方式维护“打开”文档的列表。 当然,它仅适用于基于NSDocument的应用程序,并且仅适用于在助手运行时启动的应用程序(因此您需要守护程序)。

总结:您所要问的不一定不一定是不可能的 ,但它绝非琐碎的事情(除非为提供这些信息而对框架进行了工具化,但缺少答案表明并非如此)。 考虑一下您要实现的目标,让您问这个问题,您能以另一种方式完成该任务吗?

HTH

===============>>#3 票数:1

您可以使用lsof命令。 它将返回打开文件的列表。

看看这个帖子

===============>>#4 票数:1

我建议您查看Accessibility API。 使用Accessibility API,您可以遍历可访问性对象树。 应用程序是树的最顶层。 然后,您可以浏览所有应用程序菜单,特别是“窗口”菜单项,该菜单项通常具有应用程序中可用的一系列文档。 可访问性API确实要求该过程是受信任的,并且有权查看其他应用程序。 要进行粗略的测试,以便使您确信API满足您的需要,请使用Xcode附带的可访问性检查器工具(至少5. +)。 启用此功能后,您可以查看OSX应用程序提供的所有对象。 我也使用Sublime Text。 如果每个文件都在其自己的窗口中,它将显示正在使用的文件。

  ask by J Cole Morrison translate from so

未解决问题?本站智能推荐: