Думаю, вам лучше всего использовать 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 .