如何在没有 window 的 Swift 的 macOS 上检测 Caps Lock 状态?
How to detect Caps Lock status on macOS with Swift without a window?
我试过 KeyDown
和 NSEvent
,但它们需要 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))
}
我试过 KeyDown
和 NSEvent
,但它们需要 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))
}