keypress event handler в консоли

баловался с консольным приложением, вводил цифры.
думаю «Надо поставить обработчик на ввод да не париться». и понял, что не знаю, можно ли делать обработчик на ввод в консоли.
я хочу что то вроде
if (!char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar))
    {
        e.Handled = true;
    }

нашел только б-гомерзкие примеры типа stackoverflow.com/questions/13106493/how-do-i-only-allow-number-input-into-my-c-sharp-console-application

можно ли проверять ввод напрямую из потока Console.In?
  • Вопрос задан
  • 5934 просмотра
Решения вопроса 1
Muxto
@Muxto Автор вопроса
сам спросил — сам ответил.
вообще я хотел, чтобы консоль при нажатии на клавишу создавала готовый аргумент вроде KeyEventArgs, который потом легче обработать.
уже забыл про этот вопрос, случайно наткнулся на код в книжке Шилдта.

// спасибо герберту шилдту за код
// и за наше счастливое детство

using System;
using System.ComponentModel;

// создаем класс для обработчика
class myKeyEventArgs : HandledEventArgs
{
    // нажатая кнопка
    public ConsoleKeyInfo key;

    public myKeyEventArgs (ConsoleKeyInfo _key)
    {
        key = _key;
    }
}

// класс события
class KeyEvent
{
    // событие нажатия
    public event EventHandler<myKeyEventArgs> KeyPress;

    // метод запуска события
    public void OnKeyPress(ConsoleKeyInfo _key)
    {
        KeyPress(this, new myKeyEventArgs (_key));
    }
}

// прога
class KeyEventDemo
{
    static void Main()
    {
    	// объект события
        KeyEvent kevt = new KeyEvent();
        
        // кнопа
        ConsoleKeyInfo key;

        // обработчик
        kevt.KeyPress += (sender, e) =>
        {
        	// отслеживает нажатый альт
            if (e.key .Modifiers == ConsoleModifiers .Alt )
                Console.WriteLine(" ALT! " );

            // и позволяет вводить только цифры и точку
            char ch = e.key .KeyChar  ;
            if (!char.IsDigit(ch)&& ch != '.')
            {
                e.Handled = true;
            }
            else Console.WriteLine(" нажато: " + ch );
        };

        Console.WriteLine("вводи символы, друг");
        // пока точку не нажмешь
        do
        {
        	// нажатая не отображается
            key = Console.ReadKey(true);
            // событие произошло
            kevt.OnKeyPress(key);
        }
        while(key.KeyChar != '.');
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@mayorovp
В общем случае — нет, так как ввод из Console.In может оказаться и перенаправленным.

По поводу того, что вам надо: можно поставить оконный хук на консольное окно, но лично я остановился бы на варианте просто с проверкой прочитанных символов.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы