2017-06-06 3 views
0

キーボードイベントのmyCGEventCallbackからCGEventを解析しようとしています。私は、修飾子フラグ、キーコード、UniCharにアクセスすることができます。CGEventからのキーボードショートカットの解析

これまでのところ、私はcommand + shift + fのようないくつかの組み合わせで動作させることができましたが、他の組み合わせではいくつか問題があります。

  1. コントロールとオプションは、アルファベットの代わりにいくつかの記号のUniCharを表示するようです。たとえば、オプション+ gは、オプション+ 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) 
} 

答えて

0

私はちょうどCGEventでNSEventを初期化することによってNSEventにCGEventを変換することになった、と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) 
} 
関連する問題