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