objective-c - 在外部应用程序 Objective-C 中获取当前文件

标签 objective-c cocoa

我正在尝试找出 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 要求您从要与之交互的每个应用程序生成并添加头文件。 对我来说,这个问题是我的应用程序事先不知道用户有哪些应用程序。 XCode(5) 似乎不允许我在安装时生成这些内容(即循环用户的应用程序目录并添加应用程序)或任何其他内容。

  • AppleScript 虽然不那么依赖于了解您想要使用哪些应用程序,但并不适用于所有应用程序。只有某些人支持它。

这里的最终目标是能够查看用户当前打开了哪些应用程序并获取有关这些应用程序当时打开的内容的信息。

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

最佳答案

为了实现您的要求,您需要对多个 API 进行大量工作。我们实现了这个,花了几周时间才完成。这里有一些提示:

  • 使用 NSRunningApplication 获取 Unix-PID
  • 使用 AppleScript 和 AXAPI 获取窗口及其文档。
    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要遍历所有应用程序的窗口,然后为每个应用程序使用窗口 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

要查看其执行方式的示例,check out our app 。该功能确实很难维护,并且在大多数情况下都可以工作。请参阅 Developer Section 中的此页面上应如何实现其他应用程序.

查看实际效果:

  • 向 Raskin 添加包含各种文档的文件夹(例如单词、数字、文本、Photoshop 等)
  • 在他们的应用中打开这些文档
  • 大多数文档在打开时都会显示徽章
  • 然后您可以使用 cmd-alt-R 或 cmd-alt-scroll 从任何打开的文档返回到公开此文件的 Raskin Surface

Open In Badge on a Text Document

关于objective-c - 在外部应用程序 Objective-C 中获取当前文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23191675/

相关文章:

ios - 核心数据获取唯一属性

ios - 从 http header 中删除 cookie?

ios - 如何使用 iOS 8 弃用设置每周重复的 UILocalNotifications?

objective-c - 如何在 NSButtons 中绘制类似 NSImage 的图像(有深度)?

swift - 归档项目后如何访问添加的 pdf 文件并将其复制到用户文档文件夹中?

ios - 唯一标识符不应随 iOS 版本更改而更改

ios - 从 Swift 设置 Objective-C 类的属性

objective-c - 让我的子类拦截消息

cocoa - 将 NSTableView 绑定(bind)到 NSMutableArray

iOS SDK : about using properties when creating objects programmatically?