2016-03-18 13 views
1

Ein Teil meiner App ist das Öffnen von Anwendungen und das Bewahren des Arbeitsbereichs, in dem sie geöffnet haben. Mein Problem ist zu überprüfen, ob das Hauptanwendungsfenster geöffnet ist nächster Arbeitsraum. Normalerweise könnte ich einfach prüfen, ob ein Fenster, wenn diese App geöffnet war, aber für einige Apps wie IntelliJ IDEA gibt es ein Ladefenster, das nicht Haupt ist, aber immer noch in CGWindowListCopyWindowInfo() angezeigt wird. Ich überprüfe, ob ein Fenster der App geöffnet ist, und überprüfe dann, ob es einen Titel hat. Dies funktioniert für die IntelliJ IDEA-Anwendungen, aber Anwendungen wie Taschenrechner, die Hauptfenster der Apps ohne Fenstertitel haben, geht der Code in eine unendliche Warteschleife über. Ich habe gegoogelt und mir nichts ausgedacht, und das ist eines der letzten Dinge, die in meiner App behoben werden müssen.Überprüfen Sie, ob das Hauptfenster der Anwendung geöffnet und geladen ist

Wird Code hinzufügen später (wenn ich meinen Computer haben)

TL; DR:

ich, wenn das Hauptfenster einer App überprüfen müssen geöffnet ist. (Apps wie IntelliJ IDEA haben ein Ladefenster und das Fenster muss in einem Arbeitsraum erhalten bleiben.

Antwort

1

Nach zahlreichen Tests habe ich mit einer Antwort kommen, wenn jemand braucht es sonst.

verwendete ich die Zugänglichkeit Rahmen, und der Code ist wie folgt:

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

Dieser Code die Anzahl der (Haupt-) Fenster offen für eine App mit PID im aktuellen Arbeitsbereich kehre ich dann die AXApplication vom PID bekommen, und ich dann. Holen Sie sich die Kinder daraus: Wie im Accessibility Inspector zu sehen:

inspector

Die Kinder sind die Fenster und die Menüleiste. Die Hauptfenster haben eine Unterklasse von AXStandardWindow. Mein Code durchläuft die untergeordneten Elemente und überprüft dann die Unterroutine.

Verwandte Themen