从 CGEvent 解析键盘快捷键
Parsing Keyboard Shortcuts from CGEvent
我正在尝试从 myCGEventCallback 解析键盘事件的 CGEvent。我可以访问修饰符标志、键码、UniChar。
到目前为止,我设法让它适用于某些组合,如 command+shift+f,但我在其他一些组合中遇到了一些问题。
- 控件和选项似乎给了我一些符号而不是字母的 UniChar。例如,option+g 会给我 option+copyright 符号而不是 option+g。
- 我无法从 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)
}
我最终只是通过使用 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)
}
我正在尝试从 myCGEventCallback 解析键盘事件的 CGEvent。我可以访问修饰符标志、键码、UniChar。
到目前为止,我设法让它适用于某些组合,如 command+shift+f,但我在其他一些组合中遇到了一些问题。
- 控件和选项似乎给了我一些符号而不是字母的 UniChar。例如,option+g 会给我 option+copyright 符号而不是 option+g。
- 我无法从 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)
}
我最终只是通过使用 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)
}