Swift, MacOS - перехватывать нажатие клавиш и предотвращать печать на экране - PullRequest
0 голосов
/ 21 января 2019

Я хочу, чтобы пользователь мог нажимать и удерживать клавишу в качестве аппаратного ввода, не печатая ничего на экране. Например, я хочу иметь возможность использовать глобальный прослушиватель для определения, когда клавиша «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

}

1 Ответ

0 голосов
/ 22 января 2019

Во-первых, нужно ли использовать глобальный монитор?Повторное нажатие клавиши может быть перехвачено путем переопределения метода sendEvent подкласса NSWindow, содержащего текстовое поле.

class MyWindow: NSWindow {

    override func sendEvent(_ event: NSEvent) {
        if event.type == .keyDown && event.isARepeat {
            return
        }
        super.sendEvent(event)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...