2013-09-25 17 views
5

Ben herhangi bir çift tuş kombinasyonunu algılamak istemiyorum, bu yüzden çözümlerWpf'de onkeydown etkinliğinde birden çok tuş nasıl algılanır?

gibi
if(Keyboard.IsKeyDown(specificKey)){ 

} 

, işe yaramaz tabii sürece, ben 'kazandı umuyorum her anahtar durumunu kontrol olacak Yapmak zorundayım. .

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

DÜZENLEME: nihai hedef BİR (belirli bir kombinasyon/tek bir anahtar) tuş bileşimini tespit etmektir.

EDIT2: LadderLogic'in çözümü mükemmel çalışır.

+0

ben tamamen ne soran anlamıyorum eminim ama e.Key Sistemi olduğunda e.SystemKey baktım? Hangi anahtar olduğunu söylemeliyim. – Alan

+0

Yani, yakaladığınız anahtara ek olarak * başka * tuşa basıldığını tespit etmek ister misiniz? Belirli kombinasyonları yakalamak istemiyorsunuz, sadece diğer tuşlara basıldığını bilmek ister misiniz? – JDB

+0

@ Cybȫʁgϟ37 Son hedef, ANY (belirli bir çift değil) iki tuş kombinasyonunu ve örn. "bu bileşenin basılmış olduğunu söyle:" alt "+" c "" – CoolCodeBro

cevap

4

kodunuzu Refactored: XAML: <TextBox Text="text" LostFocus="TextBox_LostFocus" KeyDown="TextBox_KeyDown" KeyUp="TextBox_KeyUp"/>

kod arkasında:

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

Bu, iki tuşa basıldıktan sonra bozulur ve her ikisi de aynı anda bırakılır. –

21

Sen ile birlikte anahtar değiştirici kullanmalıdır senin özel anahtarlık

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

sadece postanıza koştu ve örneğiniz en basit/en temiz çözüm. Çirkin kodlarımdan bazılarını değiştireceğim. Teşekkür ederim. –

2

Bu test olduğunu ve birkaç iyileştirme ile çalışma çözümü. Daha sonra Hotkey olarak kullanmak üzere giriş kombinasyonlarını okuyan bir metin kutusu oluşturmak için kullanıyorum.

Özellikler: AllowedKeys, MaxKeyCount ve ModifierKeys denetleyin. Bunların her biri, gerekmediğinde kaldırılabilir.

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; 
    } 
}