2

デスクトップ上のウィンドウのリストを取得するために CGWindowListCopyWindowInfo を使用しています。Window List keysの値を使用して、表示されているウィンドウのみを除外したいと思います。私が問題を抱えている 1 つのウィンドウは、OSX メニュー バーです。私が考えた解決策の 1 つは、ウィンドウの境界の X と Y を見ることです。両方とも 0 に等しい可視ウィンドウはないようですが、この方法がどれほど信頼できるかはわかりません。

これを行うもう 1 つの方法は、PID 番号を OSX Window Server の番号と比較することですが、それを取得する方法がわかりません。誰かが私に正しい API を教えてくれますか、またはメニュー バーを除外する信頼できる方法を知っていますか?

編集:listOptions自体が十分ではないため、以下の追加でkondyと同じコードがあります:


CGRect windowBounds;
CGRectMakeWithDictionaryRepresentation((CFDictionaryRef) [windowInfo objectForKey:(id)kCGWindowBounds], &windowBounds);

if (!(windowBounds.origin.x == 0 && windowBounds.origin.y == 0))
{
    // Work with windows that aren't the Menubar
}
4

1 に答える 1

2

「ウィンドウサーバー」を除外する答えを見つけました:

CGWindowListOption listOptions = kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements;
CFArrayRef windowList = CGWindowListCopyWindowInfo(listOptions, kCGNullWindowID);

これらの ORed オプションを使用すると、Mac の「アクティビティ マネージャー」の「ウィンドウ化されたプロセス」と同じ結果が得られます。

それがあなたを助けることを願っています!

于 2013-06-21T15:16:53.633 に答える