如何在没有 window 的 Swift 的 macOS 上检测 Caps Lock 状态?

How to detect Caps Lock status on macOS with Swift without a window?

我试过 KeyDownNSEvent,但它们需要 NSWindow 对象才能激活。我希望我可以在状态栏上放置一个应用程序,并在用户按下 CapsLock 时提醒用户,即使用户正在使用任何其他应用程序。我的应用创意没有用于设置或其他任何内容的 window,只是一个指标。甚至可以做到吗?我在猜测 AppDelegate 但不知道如何让它接收修饰符事件。非常感谢任何帮助!

我查看了 "duplicate" 的堆栈溢出,但据我搜索,没有人问过这个问题。

您只需要监视为 capslock 更改的 NSEvent 修饰符标志。最简单的方法是创建一个采用 NSEvent 的方法,并检查 modifierFlags 属性 与 .deviceIndependentFlagsMask 的交集是否包含 .capsLock:

func isCapslockEnabled(with event: NSEvent) -> Bool {
    event.modifierFlags.intersection(.deviceIndependentFlagsMask).contains(.capsLock)
}

现在您只需要将全局监控事件添加到您的 applicationDidFinishLaunching 方法中:

func applicationDidFinishLaunching(_ aNotification: Notification) {
    NSEvent.addGlobalMonitorForEvents(matching: .flagsChanged, handler: flagsChanged)
}

并创建一个方法来处理flagsChanged的事件:

func flagsChanged(with event: NSEvent) {
    print("Capslock is Enabled:", isCapslockEnabled(with: event))
}