我正在使用 NSWorkspace 的 NSWorkspaceDidActivateApplicationNotification
来检测事件应用程序何时发生更改。我从通知的 userInfo 键中获取 NSRunningApplication
。
当事件文档发生更改时,我需要收到通知。我可以通过 AXUIElementCopyAttributeValue()
使用辅助功能框架的 NSAccessibilityDocumentAttribute
键来获取事件文档。
除了轮询之外,我需要一种更准确的方法来检测文档何时发生更改。一些应用程序使用多个窗口,而其他应用程序则使用具有多个选项卡的单个窗口。对于选项卡式应用程序,窗口会返回当前查看的文档。
我不必使用辅助功能框架。 AppleScript(脚本桥)似乎也能够获取窗口的文档,但辅助功能框架似乎适用于更多应用程序。
我只关心事件文档、事件窗口、事件应用程序。目前系统关注的重点是什么。
我一直在使用 Sublime Text 2 和 Xcode 等应用程序进行测试。 Sublime 返回当前选定的选项卡,其中 Xcode 返回事件项目。
最佳答案
我实际上试图实现完全相同的目标,并且我认为我已经找到了解决方案。
我所做的是使用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 .
关于macos - OS X 上事件文档更改的通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13426488/