macos - OS X 上事件文档更改的通知?

标签 macos cocoa nswindow nsworkspace nsrunningapplication

我正在使用 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/

相关文章:

objective-c - 使用 NSBorderlessWindowMask 时 View 周围的灰色边框

objective-c - Cocoa HUD 窗口 - 如何关闭最顶层?

java - 如何使用 Java 应用程序在 Mac OS X 上打开 System Profiler.app?

c++ - CLion 2017.1 CMake 在mac OS10.12 上编译报错

macos - 核心数据 nstableview 搜索栏

objective-c - MAC OS X 上的客户端得到空响应(使用 BSD 套接字和 Cocoa 的 NSFileHandle)

objective-c - 我的 Cocoa 应用程序如何收到 NSScreen 分辨率更改的通知?

objective-c - 计时器因调整窗口大小而延迟

swift - 在 mac OS 上使用 swift 4 拖放

css - 使用 xampp 在 mac os x 上加载 css 和 jquery 文件时出现错误 403