Я думаю, что вам нужно использовать клавиатуру крюк.Используйте класс, как было описано в https://social.msdn.microsoft.com/Forums/vstudio/en-US/88ae8842-5301-4b15-830e-1d6282303508/how-to-listen-to-keyboard-inputs?forum=netfxbcl
Этот класс является глобальным обработчиком перехвата клавиатуры.В методе обработчика «OnHookCallback» делайте все, что вы хотите.Это похоже на метод ReadKey ().Вы можете прочитать нажатую клавишу, ввести значение клавиши или сделать все, что захотите.Также вы можете обнаружить, что это ключевое событие - KeyDown или KeyUp.Поэтому головоломка завершена.У вас есть значение ключа, и вы знаете, что ключ вниз и ключ вверх событий.Таким образом, вы можете сравнить значение ключа при нажатии вниз со значением при отпускании.Например, если у вас было пятикратное увеличение события KeyDown без какого-либо события KeyUp, это означает, что ключ был удержан и некоторое время удерживался.Таким образом, в таких ситуациях вы можете избежать увеличения счетчика.
Однако вы используете консольное приложение, поэтому вам нужно изменить основной метод, как описано в C # глобальная клавиатура, которая открывает форму из консольного приложения
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
LowLevelKeyboardHook kbh = new LowLevelKeyboardHook();
kbh.OnKeyPressed += kbh_OnKeyPressed;
kbh.OnKeyUnpressed += kbh_OnKeyUnpressed;
kbh.HookKeyboard();
Application.Run();
kbh.UnHookKeyboard();
}