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

我试图获取系统的 NSStatusBar id: [NSStatusBar systemStatusBar] 但我不知道如何在其中获取所有 NSStatusItems。
我在 NSStatusBar 中找到了一个名为 _items 的私有(private)方法,但我无法调用它:
[[NSStatusBar systemStatusBar] _items];
Xcode 告诉我该方法不存在。

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

谢谢

最佳答案

您无法将所有项目都作为 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,但未在任何地方记录)。

关于objective-c - 如何在 OSX 中获取 NSStatusBar 的所有 NSStatusItem 元素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9139197/

10-12 21:42