检查应用程序的主要 window 是否打开并加载

Check if main window of application is open and loaded

我的应用程序的一部分是打开应用程序并保留他们打开的工作 space。我的问题是检查主应用程序 window 是否已打开,以便我可以转到并切换到下一部作品space。通常情况下,我可以只检查 A window 是否该应用程序已打开,但对于某些应用程序(如 IntelliJ IDEA),有一个加载 window 不是主要的,但仍显示在 CGWindowListCopyWindowInfo().我检查应用程序的 window 是否打开,然后检查它是否有标题。这适用于 IntelliJ IDEA 应用程序,但是像计算器这样的应用程序的主要 window 应用程序没有 window 标题,代码会进入无限等待循环。我在谷歌上搜索了一下,但没有找到任何结果,这是我的应用程序中最后需要修复的事情之一。

稍后添加代码(当我有电脑时)

TL;DR:

我需要检查应用程序的主要 window 是否打开。 (像 INTelliJ IDEA 这样的 App 有一个 loading window,window 需要保存在一个作品 space 中。

经过多次测试,我已经想出了一个答案,如果有人需要的话。

我用的是无障碍框架,代码如下:

- (NSInteger)numberOfWindowsOpenFromApplicationWithPID:(NSInteger)PID
{
    NSInteger count = 0; // For return.
    AXUIElementRef anApp = AXUIElementCreateApplication((pid_t)PID);
    CFTypeRef aChildren;
    AXUIElementCopyAttributeValue(anApp, kAXChildrenAttribute, &aChildren);

    SafeCFRelease(anApp);
    if (aChildren) {
        for (NSInteger i = 0; i < CFArrayGetCount(aChildren); i++) {
            AXUIElementRef aChild = CFArrayGetValueAtIndex(aChildren, i);
            // Get subrole
            CFTypeRef aSubrole;
            AXUIElementCopyAttributeValue(aChild, kAXSubroleAttribute, &aSubrole);

            NSString *aSubroleString = CFBridgingRelease(aSubrole);
            if (aSubroleString) {
                // Not a menu :3
                if ([aSubroleString isEqualToString:@"AXStandardWindow"]) {
                    count++;
                }
            }
        }

        SafeCFRelease(aChildren);
    } else {
        return 0;
    }
    return count;
}

此代码 return 当前工作区中具有 PID 的应用打开的(主要)windows 的数量。然后我从 PID 中获取 AXApplication,然后从中获取子项。如可访问性检查器中所示:

子项是 windows 和菜单栏。主要 windows 有一个副角色 AXStandardWindow。我的代码遍历子角色,然后检查子角色。