首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OS X上通知活动文档更改?

在OS X上通知活动文档更改?
EN

Stack Overflow用户
提问于 2012-11-17 08:45:32
回答 1查看 628关注 0票数 2

我正在使用NSWorkspace的NSWorkspaceDidActivateApplicationNotification来检测活动应用程序何时发生更改。我从通知的userInfo密钥中获取NSRunningApplication

我需要在活动文档发生更改时收到通知。我可以通过AXUIElementCopyAttributeValue()使用可访问性框架的NSAccessibilityDocumentAttribute键来获取活动文档。

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

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

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

我一直在使用Sublime Text 2和Xcode等应用程序进行测试。Sublime返回当前选定的选项卡,其中Xcode返回激活的项目。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-21 18:24:36

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

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

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

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

下面是我是如何做到的:

代码语言:javascript
复制
    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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13426488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档