Не удается прочитать свойство 'keyCode' 'symbol' Ошибка подтверждения при обнаружении клавиши-модификатора + числовой ключ - PullRequest
0 голосов
/ 15 октября 2019
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), но, к сожалению, это не помогает.

1 Ответ

1 голос
/ 16 октября 2019

Чтобы включить AXIsProcessTrusted() в своем приложении, вам нужно перейти в системные настройки macOS, открыть Security and Privacy, нажать Accessibility, щелкнуть один знак плюс, чтобы добавить приложение в список приложений, которые могут контролировать вашикомпьютер. Возможно, вам придется нажать на замок и ввести пароль, чтобы разблокировать настройки.

enter image description here

import Cocoa

class ViewController: NSViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        print("AXIsProcessTrusted:",AXIsProcessTrusted())
        NSEvent.addGlobalMonitorForEvents(matching: .keyDown) {
            self.keyDown(with: $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
        }
    }
}
...