这是一个经过测试且有效的解决方案,具有多项改进。我用它来制作一个文本框,用于读取输入组合,以便稍后用作热键。
特点:AllowedKeys
和MaxKeyCount
检查ModifierKeys
。如果不需要,它们中的每一个都可以删除。
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>
代码隐藏:
/// <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;
}
}