4

我需要在 OSX 的状态栏中获取所有元素。

我试图获取系统的 NSStatusBar id: [NSStatusBar systemStatusBar] 但我不知道如何获取其中的所有 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”的窗口中。此外,此方法可能不是特别可靠,因为状态栏项目的窗口层可能会更改(此处假定为 25,但在任何地方都没有记录)。

于 2012-02-04T07:51:00.597 回答