如果以Windows Forms形式工作,如何在C#中捕获多个关键点?
我似乎无法同时获得向上箭头和向右箭头。
答案 0 :(得分:14)
为您提供一些概念验证代码,假设Form1
包含label1
:
private List<Keys> pressedKeys = new List<Keys>();
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
pressedKeys.Add(e.KeyCode);
printPressedKeys();
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
pressedKeys.Remove(e.KeyCode);
printPressedKeys();
}
private void printPressedKeys()
{
label1.Text = string.Empty;
foreach (var key in pressedKeys)
{
label1.Text += key.ToString() + Environment.NewLine;
}
}
答案 1 :(得分:14)
我认为当你使用GetKeyboardState API函数时,你将是最好的。
[DllImport ("user32.dll")]
public static extern int GetKeyboardState( byte[] keystate );
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
byte[] keys = new byte[256];
GetKeyboardState (keys);
if ((keys[(int)Keys.Up] & keys[(int)Keys.Right] & 128 ) == 128)
{
Console.WriteLine ("Up Arrow key and Right Arrow key down.");
}
}
在KeyDown事件中,您只需要询问键盘的“状态”。 GetKeyboardState将填充您提供的字节数组,此数组中的每个元素都代表键的状态。
您可以使用每个虚拟键代码的数值访问每个键状态。当该键的字节设置为129或128时,表示该键已关闭(按下)。如果该键的值为1或0,则键处于启动状态(未按下)。值1用于切换键状态(例如,大写锁定状态)。
有关详细信息,请参阅Microsoft documentation for GetKeyboardState。
答案 2 :(得分:4)
使用
Keyboard.IsKeyDown(Key.YourKey)
你可以处理多个keydowns。
答案 3 :(得分:1)
嗯,每个按键都有不同的事件吗?
您可以为每个箭头创建四个布尔值。按下时,将该箭头的布尔值设置为true。如果触发释放,则将该箭头的布尔值设置为false。
然后你可以检查up和right布尔值是否为真,然后再做你的行动。
答案 4 :(得分:1)
有一个托管库MouseKeyHook as NuGet,它为您提供了一个方便的托管包装器。 Source code on GitHub
最近增加了对检测快捷方式,组合键和序列的支持。以下是处理箭头的用法示例:
Date of Birth: {{ dates.dateMedium(contact.dob) }}
有关详细信息,请参阅:Detecting Key Combinations and Sequences
答案 5 :(得分:0)
使用SPY ++查看如何触发关键功能。基本上,如果同时按下多个箭头键,则被击中的第一个键将触发事件,然后当第二个键被击中时,它将开始触发,您将不再看到第一个键的事件。当他们被释放时,你会看到他们的关键事件。我建议你快速简单地实现之前建议的bool标志。