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