Macos OS X上的活动文档更改通知?

Macos OS X上的活动文档更改通知?,macos,cocoa,nswindow,nsworkspace,nsrunningapplication,Macos,Cocoa,Nswindow,Nsworkspace,Nsrunningapplication,我正在使用NSWorkspace的NSWorkspaceDidActivateApplicationNotification检测活动应用程序何时更改。我从通知的userInfo键获取NSRunningApplication 我需要在活动文档更改时收到通知。我可以通过使用辅助功能框架的NSAccessibilityDocumentAttribute键通过AXUIElementCopyAttributeValue()获取活动文档 我需要一种更准确的方法来检测文档何时更改,而不是轮询。一些应用程序使用

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

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

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

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

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


我一直在使用升华文本2和Xcode等应用程序进行测试。升华返回当前选择的选项卡,其中Xcode返回活动项目。

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

我所做的是使用
CFArrayRef windowList=CGWindowListCopyWindowInfo(KCGWindowListOptionnScreenOnly | 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);

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

这可能是不使用可访问性框架的最佳方式。不幸的是,您仍然需要进行投票,而这并没有提供当前文档的URL。但对于MAS来说,这似乎是唯一的办法。是的,我也这么认为。如果你还想知道什么,请告诉我:)