gpt4 book ai didi

objective-c - 检查应用程序的主窗口是否打开并加载

转载 作者:行者123 更新时间:2023-12-03 17:10:11 25 4
gpt4 key购买 nike

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

稍后添加代码(当我有计算机时)

TL;博士:

我需要检查应用程序的主窗口是否打开。 (像 INtelliJ IDEA 这样的应用程序有一个加载窗口,并且该窗口需要保存在工作空间中。

最佳答案

经过多次测试,如果其他人需要的话,我已经找到了答案。

我使用了accessibility框架,代码如下:

- (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;
}

此代码返回当前工作区中具有 PID 的应用程序打开的(主)窗口数。然后我从 PID 中获取 AXApplication,然后从中获取子项。正如在辅助功能检查器中看到的:

inspector

子项是窗口和菜单栏。主窗口有一个子角色AXStandardWindow。我的代码循环遍历子角色,然后检查子角色。

关于objective-c - 检查应用程序的主窗口是否打开并加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36091785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com