2017-06-08 16 views
1

非押下キーが押されたときのみ、キー押下イベントを検出したいと考えています。 次に、どの修飾キーが同時に押されたかを知りたいと思います。Altキーを1回押すだけでキー押下を検出する方法

インスタンスの場合:
Shiftキーを押したとき:_______何も出力しません。
Shift + Aを押したとき:_____ "Shift A"を出力したいですか?
私が押しShiftキー+ Altキー+ A:__私は出力 "Shiftキー+ AltキーA"
したいと思い、私は押したときのAlt + A:_______私はしかし、 "AltキーA"

出力したいと思い、 " Shift/Ctrlを押さないと、Keyboard.IsKeyDownでAltキーの押下を検出できないため、「Alt A」は表示されません

以下はテストコードの一部です。

private void Window_KeyDown(object sender, KeyEventArgs e) 
{ 
    Key key = e.Key; 

    if (key.ToString().Contains("Ctrl") | key.ToString().Contains("Shift") | key.ToString().Contains("Alt")) 
     return; 

    Label_Test.Content = ""; 

    if (Keyboard.IsKeyDown(Key.LeftShift) | Keyboard.IsKeyDown(Key.RightShift)) 
    { 
     if (Label_Test.Content.ToString() != "") 
      Label_Test.Content += "+"; 
     Label_Test.Content += "Shift"; 
    } 
    if (Keyboard.IsKeyDown(Key.LeftCtrl) | Keyboard.IsKeyDown(Key.RightCtrl)) 
    { 
     if (Label_Test.Content.ToString() != "") 
      Label_Test.Content += "+"; 
     Label_Test.Content += "Ctrl"; 
    } 
    if (Keyboard.IsKeyDown(Key.LeftAlt) | Keyboard.IsKeyDown(Key.RightAlt)) 
    { 
     if (Label_Test.Content.ToString() != "") 
      Label_Test.Content += "+"; 
     Label_Test.Content += "Alt"; 
    } 
    if (Keyboard.IsKeyDown(Key.System)) 
    { 
     if (Label_Test.Content.ToString() != "") 
      Label_Test.Content += "+"; 
     Label_Test.Content += "Alt"; 
    } 
    if (Label_Test.Content.ToString() != "") 
     Label_Test.Content += " "; 
    Label_Test.Content += key.ToString(); 
} 

私も

if (e.KeyboardDevice.Modifiers.ToString().Contains("Alt")) 

を試みたが、結果は同じでした。 「Alt + A」はどのように検出できますか?



編集:ありがとうございます。私はこのようなKey.Systemをチェックする最後のif文を編集しました。

if (e.Key == Key.System) 
{ 
    key = e.SystemKey; 
    if (e.SystemKey.HasFlag(Key.LeftAlt) | e.SystemKey.HasFlag(Key.RightAlt)) 
     return; 
    Label_Test.Content = "Alt"; 
} 
+0

MVVMパターンを使用していますか?ジェスチャを入力するためのbinコマンドを使用して、このコードの問題を回避することができます。 –

答えて

2

のみ修飾子は、すべての修飾キーとe.Keyを比較し、この場合は空文字列を返し押すかどうかをチェックします。

e.Keyが修飾キーでない場合は、現在押されている修飾キーとともに印刷する必要があります。これらの修飾子を取得するには、を除くModifierKeys列挙型のすべての値を反復し、Keyboard.Modifiersの各値に対してHasFlagを呼び出します。

private void Window_KeyDown(object sender, KeyEventArgs e) 
{ 
    var modifierKeys = new[] 
    { 
     Key.LeftCtrl, Key.RightCtrl, 
     Key.LeftAlt, Key.RightAlt, 
     Key.LeftShift, Key.RightShift, 
     Key.LWin, Key.RWin 
    }; 

    var key = e.Key; 
    if (key == Key.System) 
     key = e.SystemKey; 
    else if (key == Key.ImeProcessed) 
     key = e.ImeProcessedKey; 

    if (modifierKeys.Contains(key)) 
    { 
     Label_Test.Content = string.Empty; 
     return; 
    } 

    var modifiers = Keyboard.Modifiers; 
    var modifiersPressed = Enum.GetValues(typeof(ModifierKeys)) 
           .OfType<ModifierKeys>() 
           .Where(k => k != ModifierKeys.None && modifiers.HasFlag(k)); 

    Label_Test.Content = string.Join("+", modifiersPressed.OfType<object>() 
                  .Concat(new object[] { key })); 
} 
+0

ありがとうございますが、あなたのコードでさえ "Alt A"は機能しません。私がCtrl + Alt、Shift + AltまたはShift + Ctrl + Altを押していると結果は得られますが、Alt + Aは表示されません。私はAltキーのみを保持しているようだが、KeyEventAgrsは非修飾キー押下検出の結果をe.keyに与えない。 – chihirobelmo

+0

@chihirobelmo更新された回答をご覧ください。 – Maxim

+0

Alt +任意の非修飾キーを押すと「Alt + System」と表示されます。デバッグモードを実行中にAlt +任意のキーを押すと、Windowsのシステム音「Tin!」が聞こえます。おそらく英語以外のWindowsやIMEがこの動作をしていますか?私はUSのレイアウトキーボードを使用していますがEN IMEに切り替えましたが、動作は同じです... – chihirobelmo

関連する問題