2016-03-18 12 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を持つアプリケーションのためのオープン(メイン)ウィンドウの数を返し、その後、Iアクセシビリティインスペクタに表示されているとおり:

inspector

子供はウィンドウとメニューバーです。メインウィンドウのサブロールはAXStandardWindowです。私のコードは子供をループし、そしてサブロールをチェックします。

関連する問題