Как определить статус Caps Lock в macOS с помощью Swift без окна?

Я пробовал KeyDown и NSEvent, но они требуют, чтобы объект NSWindow был активен. Я надеюсь, что смогу поместить приложение в строку состояния и предупредить пользователя, когда он нажмет CapsLock, даже если пользователь находится в любом другом приложении. Моя идея приложения не имеет окна для настроек или чего-то еще, это просто индикатор. Можно ли это сделать? Я предполагаю, что AppDelegate, но не могу понять, как заставить его получать события модификатора. Любая помощь действительно ценится!

Я искал переполнение стека для «дубликата», но никто никогда не задавал этот вопрос, насколько я искал.


person Ryuuzaki Julio    schedule 04.01.2020    source источник
comment
Отвечает ли это на ваш вопрос? Обнаружение нажатия клавиши глобального модификатора в Swift   -  person Willeke    schedule 04.01.2020


Ответы (1)


Вам просто нужно следить за изменением флагов модификатора NSEvent для capslock . Самый простой способ — создать метод, который принимает 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))
}
person Leo Dabus    schedule 04.01.2020
comment
как бы вы проверили, не работает ли Caps Lock при запуске? т.е. что, если событие произошло ДО запуска, как KeyMap, давно - person Roy Lovejoy; 08.12.2020