Я использую 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.