Вы не можете получить все элементы как NSStatusItem
объекты, потому что они не все принадлежат вашему процессу.
Если вас интересует только то, где они находятся на экране и какими приложениями они принадлежат, вы можете сделать это с помощью API CGWindow
, поскольку технически элементы состояния (без полей) являются окнами. Вот пример, который регистрирует информацию обо всех элементах строки состояния:
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». Кроме того, этот метод не может быть особенно надежным, поскольку слой окна для элементов строки состояния может измениться (здесь предполагается, что он равен 25, но это нигде не задокументировано).