Можно ли программно очистить историю консоли?

при работе с консольным приложением, история всего, что было введено в Console.ReadLine() хранится. Когда на консоли появится приглашение ввести что-то, нажатие курсора вверх/вниз будет прокручивать эту историю (и всю историю можно просмотреть, нажав F7).

С помощью C#, есть ли способ отключить это поведение или очистить историю того, что уже ввели?


разъяснить Console.Clear() не очищает историю, только буфер экрана. Я хочу очистить историю команд.


EDIT: попробовав несколько предложенных методов, а также некоторые из моих собственных разработок, лучший подход-тот, который предложил ho1. Это не идеально, потому что он вызывает другое окно консоли, но он очищает историю.

6 ответов


Edit: удален неправильный ответ (я запутался в том, что вы хотели сделать) и добавил еще один (надеюсь) лучший ответ.

возможно, это можно сделать, освободив текущую консоль с помощью FreeConsole а затем выделение новой консоли с помощью AllocConsole. Я бы предположил, что тогда он не сохранит историю командной строки.

В общем случае, если вы хотите делать что-то с консолью, которая не поддерживается .Net Framework, это Страница MSDN-хорошее место для поиска:Функции Консоли


может этот пост как я могу настроить историю командной строки, DOSKEY? помочь?

в старые дни DOS была доступна утилита, DOSKEY.EXE, который позволял пользователю циклически выполнять предыдущие команды. В NT это включено по умолчанию, и вы можете цикл через старые команды, однако DOSKEY имеет другие возможности.

чтобы очистить текущую историю командной строки, используйте команду:

doskey /reinstall

вы можете также выборочно сказать его как многие старые команды, чтобы сохранить параметр /listsize

doskey /reinstall /listsize=50

сохранит 50 старых команд.

пожалуйста, дайте мне знать, если это работает и как вы его использовали :)


посмотри SetConsoleHistoryInfo. Согласно документации, он работает только на Vista и выше, поэтому я не уверен, поможет ли он вам или нет.


этот код работает для меня, чтобы очистить историю команд. Ограниченное тестирование и отсутствие гарантий переносимости.

public static partial class ConsoleEx
{
    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool SetConsoleHistoryInfo(CONSOLE_HISTORY_INFO ConsoleHistoryInfo);

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool GetConsoleHistoryInfo(CONSOLE_HISTORY_INFO ConsoleHistoryInfo);

    [StructLayout(LayoutKind.Sequential)]
    private class CONSOLE_HISTORY_INFO
    {
        public uint cbSize;
        public uint BufferSize;
        public uint BufferCount;
        public uint TrimDuplicates;
    }

    public static void ClearConsoleHistory()
    {
        var chi = new CONSOLE_HISTORY_INFO();
        chi.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(CONSOLE_HISTORY_INFO));

        if (!GetConsoleHistoryInfo(chi))
        {
            return;
        }

        var originalBufferSize = chi.BufferSize;
        chi.BufferSize = 0;

        if (!SetConsoleHistoryInfo(chi))
        {
            return;
        }

        chi.BufferSize = originalBufferSize;

        if (!SetConsoleHistoryInfo(chi))
        {
            return;
        }
    }
}

кажется, по МСН (http://msdn.microsoft.com/en-ie/library/system.console_members.aspx) Метод console.clear() "очищает буфер консоли .."


вы можете попробовать использовать свойство

Console.BufferHeight : "This property defines the number of rows (or lines) stored in the buffer that is accessed by a console mode window"