2017-09-19 5 views
0

私はスタックオーバフローでこれを見つけようとしていましたが、同時に非修飾キーが押されていることを知っていました。Swift OSX:同時コマンド+非修飾キーイベント

私はコマンド+ 1、コマンド+ 2、...、コマンド+ nまたはオプション+ IまたはCtrl + qなどのコマンドを作成しようとしています。それぞれ修飾キーと非修飾キーの組み合わせです。

私はkeyDownやkeyUpなどのすべてのオーバーライドを使用し、InterpretKeyEventsを使用してcancelOperationやnewLineなどの他のキーをオーバーライドします。

私は修飾キー(flagsChanged)

の状態になりますが、上記だけで、私はNSEventの修飾フラグチェッカーを引き出すことができ、修飾キーの状態を登録するように見えるんオーバーライドを見つけましたが、I目的の機能を呼び出すために同時にキーを押すことができないようです。

私は数値キーにアクセスするために異なる組み合わせを使用しようとしているので、各修飾子+数値は私にその数字の異なる設定を与えるでしょう。完全を期すためにそう

+0

メニュー項目を作成すると役立ちます。各メニュー項目にキーボードショートカットを付けることができます。 https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/MenuList/MenuList.html#//apple_ref/doc/uid/10000032i – user1046037

+0

を参照してください。同等のキーの処理については、「キーの同等物の処理」セクションで説明しています。 https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/EventOverview/HandlingKeyEvents/HandlingKeyEvents.html – matt

答えて

0

、そして皆さんからの提案のおかげで、ここで私が撮ったアプローチです:英数字キーの

1-辞書を整数戻りに関連する機能に整数に 2-辞書ポインティングを指しては、 alfanumericalsの 3 - 以下のキーキャプチャのコード。 2つの関数ポインタを修飾子のrawIndex値に関連付けることで改善することができますが、これは問題を抱えているか、同じ質問をする可能性がある人にとっては十分です。プロファイリングでは、私は平均して0.2〜0.8 msの応答時間を得ることができます。

override func keyDown(with event: NSEvent) { 
     let modifierFlags = event.modifierFlags 
     let key = event.characters! 
     if !event.isARepeat{ 
      if modifierFlags.rawValue == 256{ 
//No modifiers pressed 
       guard let track = Int(key) else{ 
//not a number key so proceed with the function library containing relevant pointers 
        functionLib[keys[key]!]!(0) 
//keys is [String: Int] 
        return 
       } 
//Proceed with another function as we are using number keys 
       command(keys[key]!) 
      }else if modifierFlags.contains(NSEventModifierFlags.command){ 
//Command key is being pressed simultaneously 
       guard let track = Int(key) else{ 
//Go into command and non number key combinations 
        functionLib[commandKeys[key]!]!(0) 
        return 
       } 
//Command and number key combo function call 
       openTrack(track) 
      } 
    } 
    } 

注:そこ非マッピングされたキーがリターン機能につながることを可能にする関数ライブラリ内のボイドの機能があるので、いくつかの、辞書を持つ:などのキーのみで、コマンド+キー、オプション+キー..です使用するコマンドの完全なセットを取得するのに便利です。 また、else文と1〜3漸近点を獲得することを避けるための1つの追加ステップは、修飾子キーrawValueを独自のdictに関連付けることです。おそらくモナドの構造の何かが、それは十分に速いようです。