【发布时间】:2009-04-02 12:36:45
【问题描述】:
在使用Windows Forms 表单时,如何在 C# 中捕获多个按键?
我似乎无法同时获得向上箭头和向右箭头。
【问题讨论】:
在使用Windows Forms 表单时,如何在 C# 中捕获多个按键?
我似乎无法同时获得向上箭头和向右箭头。
【问题讨论】:
我认为你最好使用 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 表示切换键状态(例如,大写锁定状态)。
【讨论】:
为您提供一点概念验证代码,假设 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;
}
}
【讨论】:
有
Keyboard.IsKeyDown(Key.YourKey)
您可以处理多个按键操作。
【讨论】:
嗯,每个按键都有单独的事件吗?
您可以为每个箭头创建四个布尔值。当它被按下时,将该箭头的布尔值设置为 true。如果释放被触发,则将该箭头的布尔值设置为 false。
然后您可以检查 up 和 right 布尔值是否为真,然后执行您的操作。
【讨论】:
有一个托管库MouseKeyHook as NuGet,它为您提供了一个方便的托管包装器。 Source code on GitHub.
最近添加了对检测快捷键、组合键和序列的支持。下面是一个处理箭头的用法示例:
Hook.AppEvents().OnCombination(new Dictionary<Combination, Action>
{
{Combination.FromString("Left"), GoWest},
{Combination.FromString("Left+Up"), GoNorthWest},
{Combination.FromString("Up+Left"), GoNorthWest},
{Combination.FromString("Up"), GoNorth},
{Combination.FromString("Up+Right"), GoNorthEast},
{Combination.FromString("Right+Up"), GoNorthEast},
});
欲了解更多信息,请参阅:Detecting Key Combinations and Sequences
【讨论】:
使用 SPY++ 查看按键是如何触发的。基本上,如果同时按住多个箭头键,第一个被击中的键将触发事件,然后当第二个键被击中时,它将开始触发,您将不再看到第一个键的事件。当他们被释放时,你会看到他们的关键事件。我建议您实现之前建议的 bool 标志,它既快速又简单。
【讨论】: