Я хочу, чтобы пользователь мог нажимать и удерживать клавишу в качестве аппаратного ввода, не печатая ничего на экране. Например, я хочу иметь возможность использовать глобальный прослушиватель для определения, когда клавиша «a» нажата и удерживается без ввода «aaaaaaaaaaa» на экране. До сих пор я смотрел на несколько других потоков, таких как this , но я не смог эффективно перевести это в Swift для использования с моими глобальными мониторами. Если у кого-то есть идея, как это сделать в Swift, это будет очень полезно. Это то, что я до сих пор:
func setUpKeyInterception ( ) {
keyDownPort = CGEvent . tapCreate( tap: . cghidEventTap, place: . headInsertEventTap, options: . defaultTap, eventsOfInterest: CGEventMask((1 << CGEventType.keyDown.rawValue)), callback: keyDownCallback , userInfo: UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque()))! //keyDownPort is a CFMachPort
keyDownRunLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, keyDownPort , 0) //keyDownRunLoopSource is a CFRunLoopSource
CFRunLoopAddSource(CFRunLoopGetCurrent(), keyDownRunLoopSource, CFRunLoopMode . commonModes)
}
func keyDownCallback ( proxy: CGEventTapProxy, type: CGEventType, event: CGEvent, ptr: UnsafeMutableRawPointer ) -> Unmanaged<CGEvent>? {
if ( event . getIntegerValueField ( CGEventField . keyboardEventKeycode ) == 0x2A ) || ( event . getIntegerValueField ( CGEventField . keyboardEventKeycode ) == 0x51 ){
event . setIntegerValueField ( CGEventField . keyboardEventKeycode , value: 0x03)
}
return nil
}