Получите несколько ключевых холмов в C#

Вы можете сделать что-то подобное

newState = {};

for (let i = 0; i < arr.length; i++) {
    newState[arr[i]] = false
}

setState(newState);

Это то, что вы пытаетесь сделать?

16
задан Peter Mortensen 10 December 2015 в 17:27
поделиться

4 ответа

Я думаю, что Вы будете лучше всего выключены при использовании 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 заполнит массив байтов, который Вы даете, и каждый элемент в этом массиве представляет состояние ключа.

Можно получить доступ к каждому keystate при помощи численного значения каждого кода виртуальной клавиши. Когда байт для того ключа установлен на 129 или 128, это означает, что клавиша вниз (нажата). Если значение для того ключа равняется 1 или 0, ключ возрос (не нажат). Значение 1 предназначено для переключенного ключевого состояния (например, состояния Caps Lock).

Для получения дополнительной информации см. документацию Microsoft для GetKeyboardState.

15
ответ дан 30 November 2019 в 16:58
поделиться

Немного подтверждения концепции кодирует для Вас, принимая 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;
    }
}
14
ответ дан 30 November 2019 в 16:58
поделиться

Хм, есть ли отдельные события для каждого ключа вниз?

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

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

1
ответ дан 30 November 2019 в 16:58
поделиться

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

0
ответ дан 30 November 2019 в 16:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: