2013-09-25 6 views
5

Ich will keine Doppeltastenkombination erkennen, so Lösungen wieWie erkennen Sie mehrere Keys onkeydown-Ereignis in WPF?

if(Keyboard.IsKeyDown(specificKey)){ 

} 

wird nicht funktionieren, es sei denn natürlich, werde ich jeden einzelnen Tastenzustand überprüfen, was ich hoffe, ich ‚gewonnen Ich muss es tun. .

private void TextBox_KeyDown_1(object sender, KeyEventArgs e) 
    { 
     Console.WriteLine(combination of keys pressed); 
    } 

EDIT: Das Endziel ist es, alle (nicht eine spezifische Kombination/Single-Taste) Tastenkombination zu erkennen.

EDIT2: Die Lösung von LadderLogic funktioniert perfekt.

+0

Ich bin nicht sicher, ob ich völlig verstehen, was Sie fragen, aber haben Sie sich e.SystemKey wenn e.Key System? Es sollte sagen, welcher Schlüssel es ist. – Alan

+0

Sie möchten also feststellen, ob zusätzlich zu dem von Ihnen erfassten Schlüssel noch * andere * Tasten gedrückt werden? Sie möchten bestimmte Kombinationen nicht erfassen, Sie möchten nur wissen, ob andere Tasten gedrückt werden? – JDB

+0

@ Cybȫʁgϟ37 Das Endziel besteht darin, irgendeine (nicht ein spezifisches Paar) Zwei-Tasten-Kombination zu erkennen und z.B. "Sagen Sie, diese Kombination wurde gedrückt:" alt "+" c "" – CoolCodeBro

Antwort

4

überarbeitete Code: XAML: <TextBox Text="text" LostFocus="TextBox_LostFocus" KeyDown="TextBox_KeyDown" KeyUp="TextBox_KeyUp"/>

Code-Behind:

List<Key> _pressedKeys = new List<Key>(); 


private void TextBox_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (_pressedKeys.Contains(e.Key)) 
     return; 
    _pressedKeys.Add(e.Key); 


    PrintKeys(); 
    e.Handled = true; 
} 

private void TextBox_KeyUp(object sender, KeyEventArgs e) 
{ 
    _pressedKeys.Remove(e.Key); 
    PrintKeys(); 
    e.Handled = true; 

} 

private void PrintKeys() 
{ 
    StringBuilder b = new StringBuilder(); 

    b.Append("Combination: "); 
    foreach (Key key in _pressedKeys) 
    { 
     b.Append(key.ToString()); 
     b.Append("+"); 
    } 
    b.Length--; 
    Console.WriteLine(b.ToString()); 
} 

private void TextBox_LostFocus(object sender, RoutedEventArgs e) 
{ 
    _pressedKeys.Clear(); 
} 
+0

Dieser Vorgang wird abgebrochen, sobald zwei Tasten gedrückt werden und beide gleichzeitig losgelassen werden. –

21

sollten Sie Zusatztaste in Kombination verwenden, um mit Ihrem individuellen Schlüssel

if ((Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt) // Is Alt key pressed 
{ 
    if (Keyboard.IsKeyDown(Key.S) && Keyboard.IsKeyDown(Key.C)) 
    { 
    // do something here 
    } 
} 
+6

ist gerade in Ihren Beitrag gelaufen, und Ihr Beispiel ist die einfachste/sauberste Lösung. Ich werde etwas von meinem hässlichen Code umgestalten. Vielen Dank. –

2

Dies ist ein getestet und Arbeitslösung mit mehreren Verbesserungen. Ich verwende es, um ein Textfeld zu erstellen, das Eingabekombinationen liest, die später als Hotkeys verwendet werden.

Features: AllowedKeys, MaxKeyCount und ModifierKeys überprüfen. Jeder von ihnen kann entfernt werden, wenn nicht benötigt wird.

XAML:

<Window x:Class="KeyTestApp.KeyTestWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="KeyTestWindow" SizeToContent="WidthAndHeight"> 
    <StackPanel> 
     <TextBox PreviewKeyDown="TextBox_KeyDown" Height="20" Width="165" Name="tbHotkeys" /> 
    </StackPanel> 
</Window> 

Codebehind:

/// <summary> 
/// Interaction logic for KeyTestWindow.xaml 
/// </summary> 
public partial class KeyTestWindow : Window 
{ 
    int MaxKeyCount = 3; 
    List<Key> PressedKeys = new List<Key>(); 
    List<Key> AllowedKeys = new List<Key>(); 

    public KeyTestWindow() 
    { 
     InitializeComponent(); 
     tbHotkeys.Focus(); 

     //Init the allowed keys list 
     AllowedKeys.Add(Key.LeftCtrl); 
     AllowedKeys.Add(Key.A); 
     AllowedKeys.Add(Key.B); 
     AllowedKeys.Add(Key.LeftShift); 
    } 

    private void TextBox_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Handled) return; 

     //Check all previous keys to see if they are still pressed 
     List<Key> KeysToRemove = new List<Key>(); 
     foreach (Key k in PressedKeys) 
     { 
      if (!Keyboard.IsKeyDown(k)) 
       KeysToRemove.Add(k); 
     } 

     //Remove all not pressed keys 
     foreach (Key k in KeysToRemove) 
      PressedKeys.Remove(k); 

     //Add the key if max count is not reached 
     if (PressedKeys.Count < MaxKeyCount) 
      //Add the key if it is part of the allowed keys 
      //if (AllowedKeys.Contains(e.Key)) 
      if (!PressedKeys.Contains(e.Key)) 
       PressedKeys.Add(e.Key); 

     PrintKeys(); 

     e.Handled = true; 
    } 

    private void PrintKeys() 
    { 
     //Print all pressed keys 
     string s = ""; 
     if (PressedKeys.Count == 0) return; 

     foreach (Key k in PressedKeys) 
      if (IsModifierKey(k)) 
       s += GetModifierKey(k) + " + "; 
      else 
       s += k + " + "; 

     s = s.Substring(0, s.Length - 3); 
     tbHotkeys.Text = s; 
    } 

    private bool IsModifierKey(Key k) 
    { 
     if (k == Key.LeftCtrl || k == Key.RightCtrl || 
      k == Key.LeftShift || k == Key.RightShift || 
      k == Key.LeftAlt || k == Key.RightAlt || 
      k == Key.LWin || k == Key.RWin) 
      return true; 
     else 
      return false; 
    } 

    private ModifierKeys GetModifierKey(Key k) 
    { 
     if (k == Key.LeftCtrl || k == Key.RightCtrl) 
      return ModifierKeys.Control; 

     if (k == Key.LeftShift || k == Key.RightShift) 
      return ModifierKeys.Shift; 

     if (k == Key.LeftAlt || k == Key.RightAlt) 
      return ModifierKeys.Alt; 

     if (k == Key.LWin || k == Key.RWin) 
      return ModifierKeys.Windows; 

     return ModifierKeys.None; 
    } 
}