【问题标题】:How to get all NSStatusItem elements of NSStatusBar in OSX?如何在 OSX 中获取 NSStatusBar 的所有 NSStatusItem 元素?
【发布时间】:2012-02-04 07:28:08
【问题描述】:

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

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

[[NSStatusBar systemStatusBar] _items];

Xcode 告诉我该方法不存在。

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

谢谢

【问题讨论】:

    标签: objective-c macos nsstatusitem nsstatusbar


    【解决方案1】:

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

    【讨论】:

    • 您好,我需要在状态栏中获取应用程序。诸如保管箱、电池状态等图标......我想在列表框中列出它们。我更改了您的代码以列出所有窗口,但 Dropbox 和其他应用程序未出现在结果中
    • @JonathanChacón,您找到解决方案了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 2015-02-03
    • 2020-12-11
    相关资源
    最近更新 更多