Захват нескольких нажатий клавиш в C # - PullRequest
15 голосов
/ 02 апреля 2009

Как записать несколько нажатий клавиш в C # при работе в Windows Forms форме?

Я просто не могу получить одновременно стрелку вверх и стрелку вправо.

Ответы [ 6 ]

14 голосов
/ 02 апреля 2009

Думаю, вам лучше всего использовать API-функцию GetKeyboardState.

[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 для GetKeyboardState .

14 голосов
/ 02 апреля 2009

Небольшой проверочный код для вас, предполагая, что 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;
    }
}
4 голосов
/ 01 июня 2011

С

Keyboard.IsKeyDown(Key.YourKey) 

Вы можете обрабатывать несколько нажатий клавиш.

1 голос
/ 24 января 2018

Существует управляемая библиотека MouseKeyHook as NuGet , которая предоставляет удобную управляемую оболочку. Исходный код на 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},
});

Для получения дополнительной информации см .: Определение комбинаций клавиш и последовательностей

1 голос
/ 02 апреля 2009

Хм, есть отдельные события для каждой клавиши внизу?

Вы можете создать четыре логических значения для каждой стрелки. Когда она нажата, установите для логического значения этой стрелки значение true. Если сработало освобождение, установите для логического значения этой стрелки значение false.

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

0 голосов
/ 02 апреля 2009

Используйте SPY ++, чтобы увидеть, как запускаются нажатия клавиш. В основном, если одновременно удерживать несколько клавиш со стрелками, первая нажатая клавиша будет вызывать события, а затем, когда нажимается вторая клавиша, она начнет срабатывать, и вы больше не увидите события для первой. Когда они будут выпущены, вы увидите их ключевые события. Я бы посоветовал вам реализовать предложенные ранее флаги bool, это быстро и просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...