xcode - 如何获取 Mac 菜单栏中当前的图标列表?

标签 xcode macos cocoa menubar appkit

我想访问 Mac 菜单栏中当前的图标,但找不到相关的 API 和类。我看过NSStatusBar (代表菜单栏),但它不提供对其包含的菜单栏应用程序的任何公共(public)访问。我还看过NSStatusItemNSStatusBarButton ,它们分别代表菜单栏中的项目及其视觉表示,但我发现的有关它们的所有内容都是关于制作您自己的。

如何以编程方式了解 Mac 菜单栏中的图标以及它们对应的应用程序?

最佳答案

您可以使用 CoreGraphics 中提供的功能:

let windowList = CGWindowListCopyWindowInfo([.optionOnScreenOnly], kCGNullWindowID) as! [[String: Any]]

for window in windowList {
    let boundsDict = window[kCGWindowBounds as String] as! CFDictionary
    let applicationName = window[kCGWindowOwnerName as String] as! String
    let windowName = window[kCGWindowName as String] as! String

    if let bounds = CGRect(dictionaryRepresentation: boundsDict), bounds.origin.y == 0 {
        print(applicationName, windowName, bounds)
    }
}

在测试过程中,我发现状态栏项目的边界粘在屏幕的最顶部。但尚未在多屏幕设置上进行测试。尽管如此,您所能获得的只是拥有状态栏项目的应用程序的名称。我还没有找到一种方法来创建引用栏上的项目的 NSStatusItem 实例。

关于xcode - 如何获取 Mac 菜单栏中当前的图标列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42912012/

相关文章:

swift - 如何找到不使窗口大于屏幕尺寸的 View 的最大尺寸?

cocoa - 使用脚本桥创建 iTunes 播放列表

ios - 如何在 ViewController 中设置 Google Maps 应用程序的大小?

objective-c - 静态 NSMutableDictionary 是 "just leaking"

c++ - 为什么我的简单 cpp-netlib 程序需要这么长时间才能编译?

CGPathAddArc 与 CGPathAddArcToPoint

ios - 如何使用从左到右的动画和 alpha 0 到 1 进行 segue

ios - 应用程序仅在真实设备上启动时崩溃

swift - 文件路径中的空格替换为 (null)

macos - 如何调整复选框标签的基线?