Tengo una aplicación de consola simple escrita en C#. Quiero poder detectar las pulsaciones de las teclas de flecha para poder permitir que el usuario dirija. ¿Cómo puedo detectar eventos de keydown/keyup con una aplicación de consola?Entrada de la tecla de flecha C# para una aplicación de consola
Todo mi Google ha llevado a información sobre Windows Forms. No tengo una GUI. Esta es una aplicación de consola (para controlar un robot sobre un puerto serie).
tengo funciones escritas para manejar estos eventos, pero no tengo ni idea de cómo registrarse para recibir realmente los eventos:
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
}
Esta es probablemente una pregunta muy básica, pero estoy bastante nuevo en C# , y nunca antes tuve la necesidad de obtener este tipo de información.
Actualización: Muchos están sugiriendo que use System.Console.ReadKey(true).Key
. Esto no ayudará. Necesito saber el momento en que se mantiene presionada una tecla, cuando se lanza, con soporte para que se mantengan presionadas varias teclas simultáneamente. Además, ReadKey es una llamada de bloqueo, lo que significa que el programa se detendrá y esperará a que se presione una tecla.
Actualización: Parece que la única forma viable de hacerlo es usar Windows Forms. Esto es molesto, ya que no puedo usarlo en un sistema sin cabeza. Requerir una GUI de formulario para recibir entrada de teclado es ... estúpido.
Pero de todos modos, para la posteridad, aquí está mi solución. He creado un nuevo proyecto en mi Formulario .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
}
Tenga en cuenta que si se mantiene presionada una tecla, KeyDown será llamado en numerosas ocasiones, y KeyUp es llamado solo una vez (cuando lo suelte). Por lo tanto, debe manejar las repetidas llamadas KeyDown con elegancia.
Puede llamar a ReadKey en un hilo diferente, consulte la sugerencia de mi hilo giratorio. Aunque eso no aborda las cosas de keyup/keydown. – Rushyo