使用Accessibility API获取OS X中最前面窗口的名称

时间:2015-02-03 00:17:20

标签: objective-c macos cocoa

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

2 个答案:

答案 0 :(得分:1)

你没有完全说出来,但我猜你想要自己应用程序的最前面的窗口。我不知道这是否是最伟大的,但这对我有用:

- (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是应用程​​序窗口的窗口数,按顺序,从前到后。所以这就是“[windNumsArray objectAtIndex:1]”的原因。问题是“windowNumber”在其他方面相当无用,但我们已经到了一半。

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

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

答案 1 :(得分:1)

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

"传统上,苹果公司对这类事情一直保持沉默。 NSRunningApplication本身刚刚在10.6中引入,正如你所说,它有点受限。根据您的要求,答案可能在Accessibility框架中,也可能是CGWindow API。您可以使用NSRunningApplication中的processIdentifier将其与这些API进行匹配。"