在C#中捕获多个关键点

时间:2009-04-02 12:36:45

标签: c# winforms

如果以Windows Forms形式工作,如何在C#中捕获多个关键点?

我似乎无法同时获得向上箭头和向右箭头。

6 个答案:

答案 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标志。