【问题标题】:Get name of frontmost window in OS X with Accessibility API使用 Accessibility API 获取 OS X 中最前面窗口的名称
【发布时间】:2015-02-03 18:00:31
【问题描述】:

我试图弄清楚如何使用 Cocoa/Objective-C 获取最前面窗口的名称。我在我的应用程序中将 Accessibility API 用于其他功能,所以如果需要它很好,但我没有找到执行此操作的命令。有谁知道我如何在 Objective-C 中找到最前面的窗口的名称? 提前致谢。

【问题讨论】:

  • 抱歉不清楚,我实际上想获取任何最前面窗口的标题,任何正在运行的应用程序,而不仅仅是我自己的应用程序。

标签: objective-c macos cocoa


【解决方案1】:

您可以使用 NSApplication 的 keyWindow 并访问 NSWindow 的 title 属性。要访问其他应用程序的窗口,您可以参考这里 Getting the main window of an app via an NSRunningApplication instance

“Apple 传统上一直对这类事情非常严格。NSRunningApplication 本身是在 10.6 中引入的,正如你所说,它有点受限。根据你想要做什么,答案可能在辅助功能框架或者它可能是 CGWindow API。您可以使用 NSRunningApplication 中的 processIdentifier 将其与这些 API 匹配。"

【讨论】:

    【解决方案2】:

    你没有准确地说,但我猜你想要你自己的应用程序的最前面的窗口。我不知道这是否是最好的,但这对我有用:

    - (NSWindow*) frontmostWindowP {
    
    NSArray*    windNumsArray   = [NSWindow windowNumbersWithOptions:0];
    NSInteger   frontmostNumb   = [[windNumsArray objectAtIndex:1] integerValue];
    NSArray*    windObjsArray   = [[NSApplication sharedApplication] windows];
    
    for ( NSWindow* windP in windObjsArray )
        if ( [windP windowNumber] == frontmostNumb )
            return windP;
    
    return 0;
    

    }

    "[NSWindow windowNumbersWithOptions:0]" 返回一个任意外观的整数 "windowNumbers" 数组,例如 [ 10, 313, 319, 384 ]。对我来说,第一个数字总是“10”,而且是垃圾。我想也许它代表菜单栏,或者什么。无论如何,从前到后,元素 1 到 N 是您的应用程序窗口的 windowNumbers IN ORDER。这就是“[windNumsArray objectAtIndex:1]”的原因。问题是“windowNumber”在其他方面毫无用处,但我们已经完成了一半。

    "[[NSApplication sharedApplication] windows]" 返回一个窗口数组,这次是 NSWindow 指针,不是 任何可信任的顺序。所以剩下的就是找到具有正确 windowNumber 的 NSWindow*,因此是 for 循环。

    如果您对自己应用程序以外的窗口感兴趣,请查看“NSWindow windowNumbersWithOptions”选项。

    【讨论】:

    • first id 是一种“垃圾”,与应用程序的窗口无关,这是非常有价值的观察。对我帮助很大。
    • 我了解到您通过在windowNumbers方法中传入选项.allApplications来获取其他应用程序的窗口编号。这很好,但我如何获得其他应用程序的NSWindowNSApplication.shared.windows 只允许访问当前应用程序的窗口,而不是其他应用程序。我认为如果想对另一个应用程序的窗口做某事,可能需要查看辅助功能 API。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 2012-05-11
    相关资源
    最近更新 更多