Macos OS X上的活动文档更改通知?
我正在使用NSWorkspace的Macos OS X上的活动文档更改通知?,macos,cocoa,nswindow,nsworkspace,nsrunningapplication,Macos,Cocoa,Nswindow,Nsworkspace,Nsrunningapplication,我正在使用NSWorkspace的NSWorkspaceDidActivateApplicationNotification检测活动应用程序何时更改。我从通知的userInfo键获取NSRunningApplication 我需要在活动文档更改时收到通知。我可以通过使用辅助功能框架的NSAccessibilityDocumentAttribute键通过AXUIElementCopyAttributeValue()获取活动文档 我需要一种更准确的方法来检测文档何时更改,而不是轮询。一些应用程序使用
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来说,这似乎是唯一的办法。是的,我也这么认为。如果你还想知道什么,请告诉我:)