Как получить все элементы NSStatusItem из NSStatusBar в OSX? - PullRequest
4 голосов
/ 04 февраля 2012

Мне нужно получить все элементы в строке состояния в OSX.

Я пытался получить идентификатор NSStatusBar системы: [NSStatusBar systemStatusBar], но я не знаю, как получить в нем все NSStatusItems. Я нашел закрытый метод с именем _items в NSStatusBar, но я не могу вызвать его:

[[NSStatusBar systemStatusBar] _items];

Xcode сказал мне, что этот метод не существует.

Как мне получить все элементы NSStatusItem в NSStatusBar?

Спасибо

1 Ответ

7 голосов
/ 04 февраля 2012

Вы не можете получить все элементы как 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, но это нигде не задокументировано).

...