检测何时同时按下两个键

时间:2011-12-16 15:32:29

标签: c# .net key

我不知道这是怎么回事。

我只知道如何检测一把钥匙:

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.C)
    {
        MessageBox.Show("C key");
    }
}

4 个答案:

答案 0 :(得分:9)

您必须跟踪keydown / keyup事件,并保留当前“关闭”的所有键的列表。键盘处理程序只能触发单个键,并且由代码来检测/跟踪哪些键是关闭的,以及这些单独的keydown事件是否足够接近以便被视为“在一起”。

答案 1 :(得分:3)

如您所见,您可以使用带有布尔值的计时器事件来检测是否按下了两个键。

    bool keyup = false;
    bool keyleft = false;

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Up)
        {
            keyup = true;
        }
        else if (e.KeyCode == Keys.Left)
        {
            keyleft = true;
        }
    }

    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Up)
        {
            keyup = false;
        }
        else if (e.KeyCode == Keys.Left)
        {
            keyleft = false;
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (keyleft && keyup)
        {
            Console.Beep(234, 589);
        }
    }

答案 2 :(得分:2)

在按键事件中输入一个断点,然后同时按下两个键。
检查KeyEventArgs的KeyData。它会向您显示检测两个按键同时按下所必须使用的内容。使用这样的伪代码:

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    MessageBox.Show("KeyData is: " + e.KeyData.Tostring());
}

就像我为换档所做的一样,并且将r压在一起

e.KeyData = R | Shift

答案 3 :(得分:0)

您不需要计时器XD

    bool keyup = false;
    bool keyleft = false;

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Up)
        {
            keyup = true;
        }
        else if (e.KeyCode == Keys.Left)
        {
            keyleft = true;
        }

        if (keyleft && keyup)
        {
            Console.Beep(234, 589);
        }
    }


    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Up)
        {
            keyup = false;
        }
        else if (e.KeyCode == Keys.Left)
        {
            keyleft = false;
        }
    }