4

OSX のステータス バーのすべての要素を取得する必要があります。

System: [NSStatusBar systemStatusBar] の NSStatusBar id を取得しようとしましたが、その中のすべての NSStatusItems を取得する方法がわかりません。NSStatusBar で _items という名前のプライベート メソッドを見つけましたが、呼び出すことができません。

[[NSStatusBar systemStatusBar] _items];

Xcode は、そのメソッドは存在しないと教えてくれました。

NSStatusBar のすべての NSStatusItem 要素を取得するにはどうすればよいですか?

ありがとう

4

1 に答える 1

7

NSStatusItemすべてのアイテムがプロセスに属していないため、すべてのアイテムをオブジェクトとして取得することはできません。

それらが画面上のどこにあり、どのアプリがそれらを所有しているかだけに関心がある場合は、CGWindowAPI を使用してそれを行うことができます。技術的にはステータス項目は (ボーダレス) ウィンドウであるためです。すべてのステータス バー項目に関する情報をログに記録する例を次に示します。

NSArray *windowInfos = (NSArray *)CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID); 
for (NSDictionary *windowInfo in windowInfos) {
    if (([[windowInfo objectForKey:(id)kCGWindowLayer] intValue] == 25) 
        && (![[windowInfo objectForKey:(id)kCGWindowOwnerName] isEqual:@"SystemUIServer"])) {
        NSLog(@"Status bar item: %@", windowInfo);
    }
}
[windowInfos release];

システムのアイテムは含まれていないことに注意してください。それらはすべて「SystemUIServer」に属する 1 つのウィンドウに結合されます。また、この方法は、ステータス バー項目のウィンドウ レイヤーが変更される可能性があるため、特に信頼できるとは言えません (ここでは 25 と想定されていますが、これはどこにも文書化されていません)。

于 2012-02-04T07:51:00.597 に答える