Захват нескольких ключевых нажатий в С#
Как я могу захватить несколько ключевых нажатий на С# при работе в форме Windows Forms?
Я просто не могу получить одновременно стрелку вверх и стрелку вправо.
Ответы
Ответ 1
Я думаю, вам будет лучше, если вы используете функцию 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 заполнит массив байтов, который вы даете, и каждый элемент в этом массиве представляет состояние ключа.
Вы можете получить доступ к каждому кайстрату, используя числовое значение для каждого виртуального key code. Когда байт для этой клавиши установлен на 129 или 128, это означает, что клавиша опущена (нажата). Если значение для этой клавиши равно 1 или 0, ключ вверх (не нажат). Значение 1 предназначено для переключаемого состояния ключа (например, состояние блокировки колпачка).
Подробнее см. Документация Microsoft для GetKeyboardState.
Ответ 2
Небольшой код доказательной концепции для вас, если 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;
}
}
Ответ 3
С
Keyboard.IsKeyDown(Key.YourKey)
вы можете обрабатывать несколько ключей.
Ответ 4
Хм, существуют ли отдельные события для каждой клавиши?
Для каждой стрелки вы можете создать четыре логических элемента. Когда он будет нажат, установите для boolean этой стрелки значение true. Если выпущен выпущен, установите для boolean этой стрелки значение false.
Затем вы можете проверить правильность верного и правого логических значений, а затем выполнить свое действие.
Ответ 5
Используйте SPY ++, чтобы увидеть, как запускаются ключевые клавиши. В принципе, если несколько клавиш со стрелками удерживаются одновременно, первый нажатый клавиша загорается, а затем, когда второй ключ попадает, он начинает стрелять, и вы больше не увидите события для первого. Когда они будут выпущены, вы увидите их ключевые события. Я бы предложил вам реализовать ранее описанные флаги bool, которые были бы быстрыми и простыми.
Ответ 6
Существует управляемая библиотека 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},
});
Для получения дополнительной информации см. Обнаружение комбинаций клавиш и Seuqnces