【问题标题】:How to detect Caps Lock status on macOS with Swift without a window?如何在没有窗口的情况下使用 Swift 在 macOS 上检测 Caps Lock 状态?
【发布时间】:2020-04-22 17:36:13
【问题描述】:

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

我查看了堆栈溢出是否存在“重复”,但就我的搜索而言,没有人问过这个问题。

【问题讨论】:

标签: swift macos detect modifier nsevent


【解决方案1】:

您只需要监视为 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))
}

【讨论】:

  • 在启动时如何检查大写锁定是否关闭? IE。如果事件发生在很久以前像 KeyMap 这样的启动之前会发生什么
猜你喜欢
  • 2017-03-01
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
  • 2018-07-04
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
相关资源
最近更新 更多