У меня есть простое консольное приложение, написанное на C #. Я хочу иметь возможность обнаруживать нажатия клавиш со стрелками, чтобы позволить пользователю управлять. Как я могу обнаружить события keydown / keyup с помощью консольного приложения?
Все мои поиски привели к появлению информации о Windows Forms. У меня нет графического интерфейса. Это консольное приложение (для управления роботом через последовательный порт).
У меня есть функции, написанные для обработки этих событий, но я не знаю, как зарегистрироваться для фактического получения событий:
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.