如何在OSX中获取NSStatusBar的所有NSStatusItem元素?

时间:2012-02-04 07:28:09

标签: objective-c macos nsstatusitem nsstatusbar

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

我试图获取系统的NSStatusBar id:[NSStatusBar systemStatusBar]但我不知道如何在其中获取所有NSStatusItem。 我在NSStatusBar中找到了一个名为_items的私有方法,但我无法调用它:

[[NSStatusBar systemStatusBar] _items];

Xcode告诉我该方法不存在。

如何获取NSStatusBar中的所有NSStatusItem元素?

由于

1 个答案:

答案 0 :(得分:6)

您无法将所有项目作为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”的窗口中。此外,此方法可能不是特别可靠,因为状态栏项目的窗口层可能会更改(这里假设它为25,但在任何地方都没有记录)。