2016-03-18 27 views
1

Uygulamamın bir kısmı uygulamaları açıyor ve açtıkları çalışma alanını koruyor. Sorunum ana uygulama penceresinin açılıp açılmadığını kontrol etmekti. sonraki çalışma alanı. Normalde, eğer bu uygulama açıksa bir pencere olup olmadığını kontrol edebilirdim, ancak IntelliJ IDEA gibi bazı uygulamalar için, ana olmayan bir yükleme penceresi var, ancak yine de CGWindowListCopyWindowInfo()'da görünüyor. Uygulamanın bir penceresinin açık olup olmadığını kontrol edip, bir başlığı olup olmadığını kontrol ediyorum. Bu IntelliJ IDEA uygulamaları için çalışır, ancak pencere başlıksız uygulamaların ana penceresine sahip hesap makinesi gibi uygulamalar, kod sonsuz bekleme döngüsüne girer. Etrafımda dolaştım ve hiç bir şeyle gelmedim ve bu benim uygulamasında düzeltilmesi gereken son şeylerden biri. (Bilgisayarımı varken)Uygulamanın ana penceresinin açık ve yüklü olduğunu kontrol edin

TL sonradan kodu ekleyin Will; DR:

Ben uygulamadaki ana penceresi açık olup olmadığını kontrol etmek gerekir. (IntelliJ IDEA gibi uygulamalar bir yükleme penceresi var ve pencere çalışma alanı korunmuş olması gerekir.

cevap

1

çok testten sonra, ben başkasının ihtiyacı varsa bir cevap geldi.

kullandım erişilebilirlik çerçevesi ve kod aşağıdaki gibidir:

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

Bu kod geçerli çalışma alanında PID ile bir uygulama için açık (ana) pencere sayısını döndürmek sonra I ardından PID gelen AXApplication almak ve. Erişilebilirlik Müfettişinde görüldüğü gibi:

inspector

Çocuklar pencereler ve menü çubuğu. Ana pencereler AXStandardWindow'un bir alt köşesine sahiptir. Kodum çocuklar arasında dolaşıyor ve ardından alt rotayı kontrol ediyor.

İlgili konular