NSStatusItem
すべてのアイテムがプロセスに属していないため、すべてのアイテムをオブジェクトとして取得することはできません。
それらが画面上のどこにあり、どのアプリがそれらを所有しているかだけに関心がある場合は、CGWindow
API を使用してそれを行うことができます。技術的にはステータス項目は (ボーダレス) ウィンドウであるためです。すべてのステータス バー項目に関する情報をログに記録する例を次に示します。
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 と想定されていますが、これはどこにも文書化されていません)。