Обработка KeyEvent с использованием CFRunLoopAddSource и CGEvent.tapCreate, замедление набора текста в ОС Ma c - PullRequest
0 голосов
/ 19 марта 2020

Я использую CGEvent.tapCreate & CFRunLoopAddSource для обработки Global keyEvents, так как я хочу использовать Alt + 1 для выполнения какого-то определенного события c в моем приложении, поэтому для его обработки я использовал CGEvent.tapCreate. Но это замедляет набор текста.

Ниже приведен мой код:

func myCGEventCallback(proxy : CGEventTapProxy, type : CGEventType, event : CGEvent, refcon : UnsafeMutableRawPointer?) -> Unmanaged<CGEvent>? {

        if type == .keyDown  { //type == .keyUp || type == .flagsChanged
                let keyEvent = NSEvent(cgEvent: event)
                let numRegEx = "[0-9]"
                let numTest = NSPredicate(format: "SELF MATCHES %@", numRegEx)
                if( (keyEvent?.modifierFlags.contains(.option))! && numTest.evaluate(with: keyEvent?.charactersIgnoringModifiers) == true  ){
            // Perform my action
            return nil
                 }else{
                    return Unmanaged.passRetained(event)
                }
        }
         return Unmanaged.passRetained(event)
    }

    let eventMask = (1 << CGEventType.keyDown.rawValue) | (1 << CGEventType.keyUp.rawValue) | (1 << CGEventType.flagsChanged.rawValue)
    eventTap = CGEvent.tapCreate(tap: .cgSessionEventTap, place: .headInsertEventTap, options: .defaultTap, eventsOfInterest: CGEventMask(eventMask), callback: myCGEventCallback, userInfo: nil)
    guard (eventTap != nil) else {
        debugPrint("Failed to create event tap")
        exit(1)
    }
    let runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0)
    CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, CFRunLoopMode.commonModes)
    CGEvent.tapEnable(tap: eventTap, enable: true)

Но из-за этого кода, если мое приложение работает и я печатаю в другом приложении, оно замедлит набор текста, немного зависнет , Поэтому мой вопрос заключается в том, что я могу сделать, чтобы решить эту проблему, или есть какой-то другой способ, которым я могу выполнить свою задачу в событии Global key.

...