2

我正在使用 NSWorkspaceNSWorkspaceDidActivateApplicationNotification来检测活动应用程序何时更改。我NSRunningApplication从通知的 userInfo 键中获取。

当活动文档更改时,我需要收到通知。我可以通过使用辅助功能框架的NSAccessibilityDocumentAttribute键来获取活动文档AXUIElementCopyAttributeValue()

我需要一种更准确的方法来检测文档何时更改而不是轮询。一些应用程序使用多个窗口,而其他应用程序使用具有多个选项卡的单个窗口。对于选项卡式应用程序,窗口会返回当前查看的文档。

我不必使用可访问性框架。AppleScript(脚本桥)似乎也能够获取窗口的文档,但可访问性框架似乎适用于更多应用程序。

我只关心活动文档、活动窗口、活动应用程序。目前关注的重点是系统。

我一直在测试 Sublime Text 2 和 Xcode 等应用程序。Sublime 返回当前选择的选项卡,Xcode 返回活动项目。

4

1 回答 1

1

我实际上试图实现完全相同的目标,我想我已经找到了解决方案。

我所做的是使用CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, kCGNullWindowID);

这将为您提供所有活动窗口的列表,包括您可能不关心的窗口。

我只关心有的窗口,kCGWindowLayer = 0;所以我过滤了第 0 层上的窗口。

我是这样做的:

    CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, kCGNullWindowID);
NSMutableArray *data = [(__bridge NSArray *) windowList mutableCopy];

NSMutableArray *filteredData = [[NSMutableArray alloc] initWithCapacity:10];

for (NSMutableDictionary *theDict in data) {
    id layer = [theDict objectForKey:(id)kCGWindowLayer];

    if ([layer intValue] == 0) {
        [filteredData addObject:theDict];
    }
}

NSLog(@"window: %@", filteredData);

这可能是最优雅的解决方案,所以如果其他人有更好的想法,请分享。您还应该看看 Apple 的演示应用程序Son of Grab

于 2012-11-21T10:24:36.020 回答