Определить, когда две клавиши нажаты одновременно - PullRequest
6 голосов
/ 16 декабря 2011

Понятия не имею, как это сделать.

Я знаю только, как обнаружить один ключ:

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

Ответы [ 4 ]

10 голосов
/ 16 декабря 2011

Вы должны отслеживать события keydown / keyup и вести список всех клавиш, которые в данный момент находятся в состоянии «вниз». Обработчик клавиатуры может запускать только отдельные клавиши, и ваш код может определить / отследить, какие из них не работают, и если эти отдельные события нажатия клавиш находятся достаточно близко друг к другу, чтобы считаться «вместе».

3 голосов
/ 06 октября 2012

Как видите, вы можете использовать событие таймера с логическими значениями, чтобы определить, нажаты ли две клавиши.

    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 голосов
/ 28 июня 2018

установите точку останова в событии нажатия клавиши и нажмите две клавиши вместе.изучить KeyData KeyEventArgs.он покажет вам, что вы должны использовать, чтобы обнаружить две клавиши, нажатые вместе.Используйте некоторый фиктивный код, подобный следующему:

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

, как я сделал для shift и r, нажал вместе

e.KeyData = R | Shift

0 голосов
/ 06 октября 2012

Вам не нужен таймер 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;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...