У меня есть простое консольное приложение, написанное на C#. Я хочу иметь возможность обнаруживать нажатия клавиш со стрелками, поэтому я могу позволить пользователю управлять. Как определить события keydown/keyup с помощью консольного приложения?C# клавиша со стрелкой для консольного приложения
Все мои поисковые запросы привели к информации о видах форм. У меня нет графического интерфейса. Это консольное приложение (для управления роботом через последовательный порт).
У меня есть функции, написанные для обработки этих событий, но я понятия не имею, как зарегистрироваться на самом деле получить событие:
private void myKeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Left:
...
case Keys.Right:
...
case Keys.Up:
...
}
}
private void myKeyUp(object sender, KeyEventArgs e)
{
... pretty much the same as myKeyDown
}
Это, вероятно, на самом деле основной вопрос, но я довольно новый для C# , и мне никогда не нужно было вводить такие данные раньше.
Обновление: Многие из них предлагают использовать System.Console.ReadKey(true).Key
. Это не поможет. Мне нужно знать момент, когда ключ удерживается, когда он отпущен, при одновременном удерживании нескольких клавиш. Кроме того, ReadKey - это блокирующий вызов, что означает, что программа остановится и дождитесь нажатия клавиши.
Обновление: Кажется, что единственный способ сделать это - использовать Windows Forms. Это раздражает, поскольку я не могу использовать его в безголовой системе. Требование графического интерфейса формы для приема ввода с клавиатуры ... глупо.
Но в любом случае, для потомков, вот мое решение. Я создал новый проект формы в моем .sln:
private void Form1_Load(object sender, EventArgs e)
{
try
{
this.KeyDown += new KeyEventHandler(Form1_KeyDown);
this.KeyUp += new KeyEventHandler(Form1_KeyUp);
}
catch (Exception exc)
{
...
}
}
void Form1_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
// handle up/down/left/right
case Keys.Up:
case Keys.Left:
case Keys.Right:
case Keys.Down:
default: return; // ignore other keys
}
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
// undo what was done by KeyDown
}
Обратите внимание, что, если удерживать нажатой клавишу, KeyDown будет вызываться много раз, и KeyUp будет вызываться только один раз (при отпускании). Таким образом, вы должны обрабатывать повторяющиеся вызовы KeyDown изящно.
Вы можете вызвать ReadKey в другом потоке, см. Мое предложение о вращающемся потоке. Хотя это не касается файлов keyup/keydown. – Rushyo 2010-12-05 18:51:34