2016-03-18 7 views
1

Часть моего приложения открывает приложения и сохраняет рабочее пространство, в котором они были открыты. Моя проблема заключается в проверке открытия основного окна приложения, чтобы я мог перейти и переключиться на следующее рабочее пространство. Обычно я могу просто проверить, открыто ли окно, если это приложение открыто, но для некоторых приложений, таких как IntelliJ IDEA, есть окно загрузки, которое не является основным, но все же отображается в CGWindowListCopyWindowInfo(). Я проверяю, открыто ли окно приложения, а затем проверьте, имеет ли он заголовок. Это работает для приложений IntelliJ IDEA, но приложения, такие как калькулятор, которые имеют главное окно приложений без заголовка окна, код переходит в бесконечный цикл ожидания. Я googled вокруг и ничего не придумал, и это одна из последних вещей, которые нужно исправлять в моем приложении.Проверьте, открыто или не загружено главное окно приложения

будет добавить код позже (когда у меня есть свой компьютер)

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, а затем я. получить детей от него. Как видно из Инспектора доступности:

inspector

Дети - это окна и меню. Основные окна имеют подлог AXStandardWindow. Мой код проходит через дочерние элементы, а затем проверяет субтроп.