Почему у моего консольного приложения есть история команд? - PullRequest
19 голосов
/ 07 августа 2011

Я написал консольное приложение, которое по сути является 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");
        }
    }
}

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

Ответы [ 4 ]

20 голосов
/ 07 августа 2011

вы можете программно изменить это поведение окон, вызвав 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

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

4 голосов
/ 07 августа 2011

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

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

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

4 голосов
/ 07 августа 2011

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

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

0 голосов
/ 07 августа 2011

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

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

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

...