2012-04-18 7 views
0

私はすべての可視ウィンドウのフレームを取得する方法を理解しようとしています。 Iは、次のコードを試みたが、それは唯一のアプリケーション自体、他のウィンドウレポート{0,0,0,0}アクティブなスペース上のすべての可視ウィンドウのフレーム(原点、サイズ)を取得する方法は?

NSArray *windowArray = [NSWindow windowNumbersWithOptions:NSWindowNumberListAllApplications | NSWindowNumberListAllSpaces]; 
for(NSNumber *number in windowArray){ 
    NSLog(@"Window number: %@", number); 
    NSWindow *window = [[NSApplication sharedApplication] windowWithWindowNumber:[number intValue]]; 
    NSLog(@"Window: %@", NSStringFromRect([[window contentView] frame])); 
} 

サンプルコードは、理解されるために働きます。

答えて

2

私はそれを考え出した:

NSMutableArray *windows = (__bridge NSMutableArray *)CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, kCGNullWindowID); 

for (NSDictionary *window in windows) { 
    NSString *name = [window objectForKey:@"kCGWindowName" ]; 
    CGRect bounds; 
    CGRectMakeWithDictionaryRepresentation((CFDictionaryRef)[window objectForKey:@"kCGWindowBounds"], &bounds); 
    NSLog(@"%@: %@",name,NSStringFromRect(bounds));    
} 
+2

をあなたは 'CGWindowListCopyWindowInfo'はNSMutableArrayのを返し、それがコピー機能であるため、あなたは、配列を解放するか、' __bridge_transfer'を使用するいずれかの必要があると仮定するべきではありません。 –

+0

私もこれに取り組んできました。私は、特定のアプリケーションpidのすべてのアクティブウィンドウの囲み矩形を見つける必要がありました。 – StefanS

+0

まず、このセッション(CGWindowListCopyWindowInfo)のすべてのウィンドウのウィンドウリストを取得します。あなたは、任意のウィンドウの所有者(kCGWindowOwnwerPID)のPIDを取得し、それをあなたのPIDと一致させることができます。一致すると、必要なNSRectを正確に返す関数があります。 (kCGWindowBoundsのCGRectMakeWithDictionaryRepresentation) – StefanS

1

別のアプリケーションのウィンドウに対してNSWindowを作成することはできません。一般的に、他のアプリケーションのオブジェクトには、スクリプティングのような協力し合うインターフェイス以外でアクセスすることはできません。

Quartz Window Services (a.k.a. CGWindowList) APIを使用すると、探しているものを手に入れることができます。

私は、Cocoaから返されたウィンドウ番号がそのAPIで使用されているウィンドウ番号と同じであるとは確信していません。実際、-[NSWindow windowNumber]のドキュメントは、「これはウィンドウサーバーによって割り当てられたグローバルウィンドウ番号と同じではないことに注意してください」と特に言います。私は、あなたのアプリケーションのウィンドウ用ではない+[NSWindow windowNumbersWithOptions:]によって返されたウィンドウ番号を何に使うことができるかを確認しています。

関連する問題