检查应用程序的主要 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
。我的代码遍历子角色,然后检查子角色。
我的应用程序的一部分是打开应用程序并保留他们打开的工作 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
。我的代码遍历子角色,然后检查子角色。