class func addGlobalMonitorForEvents(matching mask: NSEvent.EventTypeMask, handler block: @escaping (NSEvent) -> Void) -> Any?{
print("this inside addGlobalMonitorForEvents")
}
NSEvent.addGlobalMonitorForEvents(matching: .flagsChanged) {
switch $0.modifierFlags.intersection(.deviceIndependentFlagsMask) {
case [.shift]:
print("shift key is pressed")
print("key code is \($0.keyCode))")
case [.control] where $0.characters == "1":
print("control key is pressed")
print("characters is \($0.characters)")
case [.option] where $0.charactersIgnoringModifiers == "1" :
print("option key is pressed")
print("\($0.charactersIgnoringModifiers) is pressed")
case [.command] where $0.keyCode == 19:
print("Command key is pressed")
print("\($0.keyCode) is pressed")
case [.command, .shift] where $0.characters == "1":
print("command-shift keys are pressed")
print("\($0.characters) are pressed")
default:
print("no modifier keys are pressed)")
}
}
Без цифровой клавиши все нормально. Пока я нажимаю shift / , команда / , опция с 1 . Это бросило исключение. Я пытался проверить числовые по ключам символов и символовIgnoringModifiers. Все они либо дают мне ошибку подтверждения Assertion failure in -[NSEvent characters]
, Assertion failure in -[NSEvent charactersIgnoringModifiers]
, либо не являются ошибкой, а вместо этого печатают keyCode самого ключа-модификатора 56 или что-то в этом роде. Я попробовал цепь .contains(.command)
и затем включил код клавиши. То же самое случилось. Я что-то здесь упустил?
Код является ссылкой здесь . Хотя я не уверен, что сделал class func
, я не видел, как «это внутри addGlobalMonitorForEvents» печаталось при нажатии клавиш. Без этой декларации это просто не работает. Так что я все равно добавил это.
Будем благодарны за любые предложения или объяснения. Спасибо
Обновление
1-й фрагмент кода: объявление функции класса необязательно. Прямо сейчас в состоянии контролировать локальное событие команда + shift + 1 , но не глобальное
override func viewDidLoad(){
super.viewDidLoad()
NSEvent.addLocalMonitorForEvents(matching: .keyDown) {
self.keyDown(with: $0)
return $0
}
}
override func keyDown(with event: NSEvent) {
switch event.modifierFlags.intersection(.deviceIndependentFlagsMask) {
case [.command] where event.characters == "1", [.command, .shift] where event.characters == "1":
print("command+1 or command+shift+1")
default:
break
}
Затем я изменил на NSEvent. addGlobalMonitorForEvents и проверьте xcodehelper на доступность конфиденциальности (это единственное, что я считаю связанным, так как я запускаю приложение в xcode), но, к сожалению, это не помогает.