从CGEvent

时间:2017-06-06 17:28:39

标签: swift3 cgeventtap

我正在尝试从myCGEventCallback解析CGEvent以获取键盘事件。我可以访问修饰符标志,键码,UniChar。

到目前为止,我设法让它适用于某些组合,例如command + shift + f,但是对于其他一些组合我有一些问题。

  1. 控制和选项似乎给了我一些符号的UniChar而不是字母。例如,选项+ g将为我提供选项+版权符号,而不是选项+ g。
  2. 我无法从UniChar获取功能键和光标。
  3. 解释结果的最佳方法是什么?例如,我想获得一个结果,如control + g,option + control + g,或者option + shift + f1,依此类推。 这是myCGEventCallback的代码。谢谢!

    func myCGEventCallback(proxy : CGEventTapProxy, type : CGEventType, event : CGEvent, refcon : UnsafeMutableRawPointer?) -> Unmanaged<CGEvent>? {
        if type == .keyDown {
            let flags = event.flags
            var msg = ""
            if flags.contains(.maskAlphaShift) {
                msg+="caps+"
            }
            if flags.contains(.maskShift) {
                msg+="shift+"
            }
            if flags.contains(.maskControl) {
                msg+="control+"
            }
            if flags.contains(.maskAlternate) {
                msg+="option+"
            }
            if flags.contains(.maskCommand) {
                msg += "command+"
            }
            if flags.contains(.maskSecondaryFn) {
                msg += "function+"
            }
    
            var keyCode = event.getIntegerValueField(.keyboardEventKeycode)
            var char = UniChar()
            var length = 0
            event.keyboardGetUnicodeString(maxStringLength: 1, actualStringLength: &length, unicodeString: &char)
    
            msg+="\(Character(UnicodeScalar(char)!))"
            debugPrint(msg)
        }
        return Unmanaged.passRetained(event)
    }
    

1 个答案:

答案 0 :(得分:2)

我最终只是通过使用CGEvent初始化NSEvent来将CGEvent转换为NSEvent,并获得charactersIgnoringModifiers。尽管如此,像escape和backspace这样的非字符仍无法使用。这是整个CGEventCallback。

func myCGEventCallback(proxy : CGEventTapProxy, type : CGEventType, event : CGEvent, refcon : UnsafeMutableRawPointer?) -> Unmanaged<CGEvent>? {
    if type == .keyDown {
        let flags = event.flags
        var msg = ""
        if flags.contains(.maskAlphaShift) {
            msg+="caps+"
        }
        if flags.contains(.maskShift) {
            msg+="shift+"
        }
        if flags.contains(.maskControl) {
            msg+="control+"
        }
        if flags.contains(.maskAlternate) {
            msg+="option+"
        }
        if flags.contains(.maskCommand) {
            msg += "command+"
        }
        if flags.contains(.maskSecondaryFn) {
            msg += "function+"
        }
        if let other = NSEvent(cgEvent: event), let chars = other.charactersIgnoringModifiers {
           msg += chars
            debugPrint(msg)
        }
    }
    return Unmanaged.passRetained(event)
}