我正在使用NSWorkspace的NSWorkspaceDidActivateApplicationNotification来检测活动应用程序何时发生更改。我从通知的userInfo密钥中获取NSRunningApplication。
我需要在活动文档发生更改时收到通知。我可以通过AXUIElementCopyAttributeValue()使用可访问性框架的NSAccessibilityDocumentAttribute键来获取活动文档。
除了轮询之外,我需要一种更准确的方法来检测文档何时发生更改。一些应用程序使用多个窗口,而其他应用程序使用带有多个选项卡的单个窗口。对于选项卡式应用程序,该窗口返回当前查看的文档。
我不需要使用可访问性框架。AppleScript (脚本桥)似乎也能够获取窗口的文档,但辅助功能框架似乎适用于更多的应用程序。
我只关心活动应用程序的活动文档、活动窗口的活动文档。目前关注的是系统。
我一直在使用Sublime Text 2和Xcode等应用程序进行测试。Sublime返回当前选定的选项卡,其中Xcode返回激活的项目。
发布于 2012-11-21 18:24:36
实际上,我正试图实现完全相同的目标,我想我已经找到了一个解决方案。
我所做的是使用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);这可能是最优雅的解决方案,所以如果其他人有更好的想法,请分享。另外,你应该看看苹果的演示应用程序Son of Grab。
https://stackoverflow.com/questions/13426488
复制相似问题