1

Quartz ウィンドウ サービスから CGWindowListCreate を使用すると、非常に長いウィンドウ ID の配列が生成されます。デスクトップ要素を除外するオプションをオンにしようとしましたが、開いているウィンドウが 3 つまたは 4 つしかない場合でも、30 ~ 40 のウィンドウのリストが表示されます。

これが私がやっている方法です:

 CGWindowListOption opt = 1 << 4;
 CFArrayRef windowids =CGWindowListCreate(opt,kCGNullWindowID);

この問題の原因となっている間違っていることと、それを修正するために何ができるかを考えています。プログラムに、ファインダー ウィンドウやブラウザー ウィンドウなど、アプリケーションによって作成されたウィンドウを一覧表示するだけで、それ以外に含まれているものは表示されません。よろしくお願いいたします。

4

2 に答える 2

1

解決策は、(ウィンドウの階層化に関して) Dock の「下」にあるウィンドウのみにウィンドウ リストをフィルター処理することです。

以下のコードは私にとってはうまくいきました。画面上のすべてのウィンドウ (デスクトップ要素を除く) をフェッチします。リストから「Dock」ウィンドウのウィンドウ ID を抽出します。次に、画面ウィンドウを再度フェッチし、Dock ウィンドウの「下」にあるウィンドウのみにフィルタリングします。

// Fetch all on screen windows
CFArrayRef windowListArray = CGWindowListCreate(kCGWindowListOptionOnScreenOnly|kCGWindowListExcludeDesktopElements, kCGNullWindowID);
NSArray *windows = CFBridgingRelease(CGWindowListCreateDescriptionFromArray(windowListArray));

NSLog(@"All on screen windows: %@", windows);

// Find window ID of "Dock" window
NSNumber *dockWindowNumber = nil;
for (NSDictionary *window in windows) {
    if ([(NSString *)window[(__bridge NSString *)kCGWindowName] isEqualToString:@"Dock"]) {
        dockWindowNumber = window[(__bridge NSString *)kCGWindowNumber];
        break;
    }
}

NSLog(@"dockWindowNumber: %@", dockWindowNumber);

CFRelease(windowListArray);

if (dockWindowNumber) {
    // Fetch on screen windows again, filtering to those "below" the Dock window
    // This filters out all but the "standard" application windows
    windowListArray = CGWindowListCreate(kCGWindowListOptionOnScreenBelowWindow|kCGWindowListExcludeDesktopElements, [dockWindowNumber unsignedIntValue]);
    NSArray *windows = CFBridgingRelease(CGWindowListCreateDescriptionFromArray(windowListArray));
    NSLog(@"On screen application windows: %@", windows);
}
else {
    NSLog(@"Could not find Dock window description");
}
于 2013-04-13T08:27:43.917 に答える
1

これは、画面上にあるか画面外にあるかに関係なく、すべてのウィンドウを返します。オプションと組み合わせる必要がありますkCGWindowListOptionOnScreenOnly(また、使用しているウィンドウをハードコーディングしないでください)。次のようになります。

CGWindowListOption opt = kCGWindowListOptionOnScreenOnly|kCGWindowListExcludeDesktopElements;
CFArrayRef windowids =CGWindowListCreate(opt,kCGNullWindowID);

とにかく、それは私がドキュメントから集めたものです。

于 2012-06-22T06:18:44.290 に答える