2017-06-06 14 views
0

我想從myCGEventCallback解析CGEvent的鍵盤事件。我可以訪問修飾符標誌,鍵碼,UniChar。解析來自CGEvent的鍵盤快捷鍵

到目前爲止,我設法讓它爲像command + shift + f這樣的組合工作,但我對其他一些組合有一些問題。

  1. 控制和選項似乎給了我一些UniChar的一些符號而不是字母表。例如,選項+ g會給我選項+版權符號而不是選項+ g。
  2. 我無法從UniChar獲取功能鍵和遊標。

解釋結果的最佳方式是什麼?例如,我想得到一個結果,如控制+ g,選項+控制+ g或選項+ 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) 
} 

回答

0

我最終通過用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) 
}