Проверьте, открыто ли и загружено ли главное окно приложения
Часть моего приложения - это открытие приложений и сохранение рабочего пространства, в котором они открылись. Моя проблема в том, чтобы проверить, открылось ли главное окно приложения, чтобы я мог перейти и перейти к следующему рабочему пространству. Обычно я мог бы просто проверить, было ли открыто окно A, если это приложение было открыто, но для некоторых приложений, таких как IntelliJ IDEA, есть окно загрузки, которое не является основным, но все же отображается в CGWindowListCopyWindowInfo()
, Я проверяю, открыто ли окно приложения, затем проверяю, есть ли у него заголовок. Это работает для приложений IntelliJ IDEA, но в таких приложениях, как калькулятор, в котором главное окно приложений не имеет заголовка окна, код переходит в бесконечный цикл ожидания. Я гуглил и ничего не придумал, и это одна из последних вещей, которые нужно исправить в моем приложении.
Добавлю код позже (когда у меня будет компьютер)
TL; DR:
Мне нужно проверить, открыто ли главное окно приложения. (Такие приложения, как INtelliJ IDEA, имеют окно загрузки, и его необходимо сохранить в рабочем пространстве.
1 ответ
После долгих испытаний я нашел ответ, если кому-то еще это нужно.
Я использовал структуру доступности, а код выглядит следующим образом:
- (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 в текущей рабочей области. Затем я получаю AXApplication из PID, а затем я получаю от него детей. Как видно из инспектора доступности:
Дети - это окна и менубар. Главные окна имеют подчиненную роль AXStandardWindow
, Мой код проходит по дочерним элементам, а затем проверяет подчиненную роль.