Подтвердить что ты не робот

Почему у моего консольного приложения есть история команд?

Я написал консольное приложение, которое по сути представляет собой Console.ReadLine() - Loop. Когда приложение ожидает ввода, нажатие клавиши со стрелкой вверх происходит по всем предыдущим строкам ввода. В моем приложении не содержится кода для этой функции. В какой части Windows это предусмотрено? Как отключить его?

Я могу только представить, что это либо функция консольной подсистемы, либо реализована в Console.ReadLine().

Вот пример кода, который показывает описанное поведение:

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            string input;
            do
            {
                input = System.Console.ReadLine();
            } while (input != "exit");
        }
    }
}

Я хотел бы отключить функцию истории на данный момент и повторно реализовать ее позже, используя свой собственный код. Текущее поведение слишком ограничено.

4b9b3361

Ответ 1

вы можете изменить это поведение окон программным путем, вызвав SetConsoleHistoryInfo с правильно настроенной структурой CONSOLE_HISTORY_INFO... похоже, нет управляемого класса/метода, поэтому вам нужно будет использовать DllImport и т.д.

http://msdn.microsoft.com/en-us/library/ms686031%28v=VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/ms682077%28v=VS.85%29.aspx

ЕСЛИ нужно - несколько других аспектов консоли можно обрабатывать управляемым образом - см. консоль С#, Console.Clear problem

Ответ 2

Функция истории встроена в оболочку командной строки Windows, она не является особенностью вашего приложения. AFAIK нет способа отключить это в вашем коде, поскольку он специфичен для среды оболочки Windows (если нет параметров, которые могут быть изменены, что, вероятно, есть)

Вы можете переопределить поведение по умолчанию, используя прослушиватель клавиш, чтобы получить все клавиши со стрелкой вверх и выполнить свой собственный код, таким образом, это событие не опустится до обрабатываемой оболочки.

Ответ 3

Да, это функция консольной подсистемы, а не ваше приложение. Чтобы изменить его, щелкните панель управления консоли (вверху слева), свойства, вкладка параметров: "История команд". По умолчанию используется 50 элементов, 4 буфера. Предположительно, это можно настроить программно с помощью DOSKEY из командной строки, но несколько минут возиться ни с чем не привели.

ALT+F7 очистит историю команд, как будет выполняться команда DOSKEY /reinstall. Я тестировал в Windows 7.

Обновление: соответствующий вызов API Win32 SetConsoleHistoryInfo, а подпись p/invoke можно найти в http://pinvoke.net/default.aspx/kernel32/SetConsoleHistoryInfo.html

Ответ 4

Не тестировалось, но похоже, что передача экземпляра CONSOLE_HISTORY_INFO в SetConsoleHistoryInfo с размером буфера и количеством отсчетов, равным 1, даст тот же самый контроль, что и диалог свойств окна консоли.

P/Вызывать определения в pinvoke.net

Также обратите внимание, что для этого требуется Windows V6 или более поздняя версия (например, Vista/2008/7/2008R2).