C# 是否可以通过编程方式清除控制台历史记录?

C# 是否可以通过编程方式清除控制台历史记录?,c#,console,console-application,C#,Console,Console Application,使用控制台应用程序时,会存储在console.ReadLine()中输入的所有内容的历史记录。在控制台提示输入内容时,按向上/向下光标将滚动此历史记录(按F7可查看整个历史记录) 使用C#,是否有方法禁用此行为或清除已输入内容的历史记录 为了澄清,Console.Clear()不清除历史记录,只清除屏幕缓冲区。我想清除命令历史记录 编辑:在尝试了几种建议的方法以及我自己的一些设计之后,最好的方法是ho1建议的方法。这并不理想,因为它会弹出另一个控制台窗口,但它确实清除了历史记录。这篇文章是否

使用控制台应用程序时,会存储在
console.ReadLine()
中输入的所有内容的历史记录。在控制台提示输入内容时,按向上/向下光标将滚动此历史记录(按F7可查看整个历史记录)

使用C#,是否有方法禁用此行为或清除已输入内容的历史记录


为了澄清,Console.Clear()不清除历史记录,只清除屏幕缓冲区。我想清除命令历史记录


编辑:在尝试了几种建议的方法以及我自己的一些设计之后,最好的方法是ho1建议的方法。这并不理想,因为它会弹出另一个控制台窗口,但它确实清除了历史记录。

这篇文章是否有帮助

在旧的DOS时代,有一个实用程序DOSKEY.EXE,它使用户可以循环使用以前的命令。在NT中,这是默认启用的,您可以循环使用旧命令,但DOSKEY具有其他功能

要清除当前命令行历史记录,请使用以下命令:

doskey /reinstall
您还可以选择告诉它/listsize参数要保留多少旧命令

doskey /reinstall /listsize=50
将保留50条旧命令


请让我知道它是否有效以及您是如何使用的:)

根据MSN()方法
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"

编辑:删除了不正确的答案(我对你想做什么感到困惑),并添加了另一个(希望)更好的答案

可以通过使用释放当前控制台,然后使用分配新控制台来实现这一点。我认为它不会保留命令行历史记录


一般来说,如果您想使用.Net Framework不支持的控制台进行操作,此MSDN页面是一个很好的查看位置:

请查看。根据文档,它只在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;
        }
    }
}

他想清除命令历史记录,而不是控制台缓冲区(如果我理解正确的话)。我已经尝试过了,但它不允许我将值设置为零。BufferHeight是所有控制台输出的可滚动窗口。这就是为什么还有BufferWidth。我想从我自己的控制台应用程序中以编程方式实现这一点,因此我不想依赖于使用外部工具。如果您要抑制的功能是由同一工具提供的呢?@Svish:我试着从代码中调用它,但它没有效果,因为它是在一个单独的控制台中启动的。看来我需要在代码中这样做,才能将其应用于当前控制台。@adrianbanks-对。。。是的,我想你会的。你是怎么喊出来的?有没有办法找出命令在后台做什么?就像我认为“保罗·简”指的那样to@Svish:好吧,我现在有点糊涂了!我通过启动一个新流程向doskey发出了呼吁。“我怎么能从C#那里喊出来呢?恐怕对历史没有任何影响。@adrianbanks:是的,我对你在做什么感到困惑(尽管至少我犯了一个与这个问题的其他答案不同的错误:)。我已经用另一种可能的解决方案更新了我的答案。删除了错误处理并替换为返回,以提高概念示例的可读性。这应该是正确的答案。它是C#.NET托管代码,用于包装Win32调用以完成所需的任务。这样的包装代码对于以编程方式实现Win32控制台功能是必需的,例如切换EOL wrap、将控制台置于屏幕中央、锁定窗口更新等。