在C#中捕获多个关键点

Pre*_*ten 16 c# winforms

Windows窗体表单中工作时,如何在C#中捕获多个键?

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

Fre*_*els 15

我认为当你使用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.");
   }
}
Run Code Online (Sandbox Code Playgroud)

在KeyDown事件中,您只需要询问键盘的"状态".GetKeyboardState将填充您提供的字节数组,此数组中的每个元素都表示键的状态.

您可以使用每个虚拟键代码的数值访问每个键状态.当该键的字节设置为129或128时,表示该键已关闭(按下).如果该键的值为1或0,则键处于启动状态(未按下).值1用于切换键状态(例如,大写锁定状态).

有关详细信息,请参阅GetKeyboardStateMicrosoft文档.


Tor*_*kår 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;
    }
}
Run Code Online (Sandbox Code Playgroud)