1

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

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

  1. 控制和选项似乎给了我一些符号而不是字母的 UniChar。例如,option+g 将给我 option+copyright 符号而不是 option+g。
  2. 我无法从 UniChar 获取功能键和光标。

解释结果的最佳方式是什么?例如,我想得到一个像 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)
}
4

1 回答 1

5

我最终只是通过使用 CGEvent 初始化 NSEvent 来将 CGEvent 转换为 NSEvent,并获取 charactersIgnoringModifiers。但是,转义和退格等非字符将不起作用。这是整个 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)
}
于 2017-06-12T19:37:50.623 回答