我不想检测任何双键组合,所以像
这样的解决方案if(Keyboard.IsKeyDown(specificKey)){
}
不起作用,除非当然,我会检查每一个关键状态,我希望我不必这样做。
private void TextBox_KeyDown_1(object sender, KeyEventArgs e)
{
Console.WriteLine(combination of keys pressed);
}
编辑: 最终目标是检测ANY(非特定组合/单键)组合键。
EDIT2:LadderLogic的解决方案非常有效。
答案 0 :(得分:24)
您应该将键修饰符与自定义键结合使用
if ((Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt) // Is Alt key pressed
{
if (Keyboard.IsKeyDown(Key.S) && Keyboard.IsKeyDown(Key.C))
{
// do something here
}
}
答案 1 :(得分:4)
重构你的代码:
XAML:
<TextBox Text="text" LostFocus="TextBox_LostFocus" KeyDown="TextBox_KeyDown" KeyUp="TextBox_KeyUp"/>
代码隐藏:
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();
}
答案 2 :(得分:2)
这是经过测试和运行的解决方案,有多项改进。 我用它来创建一个文本框,读取输入组合,以便以后用作热键。
功能: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;
}
}