【问题标题】:Is is possible to programmatically clear the console history?是否可以以编程方式清除控制台历史记录?
【发布时间】:2011-03-15 18:29:45
【问题描述】:

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

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


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


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

【问题讨论】:

    标签: c# console console-application


    【解决方案1】:

    How can I configure the command line history, DOSKEY? 上的这个帖子有帮助吗?

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

    要清除当前命令行历史使用命令:

    doskey /reinstall
    

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

    doskey /reinstall /listsize=50
    

    将保留 50 个旧命令。

    请告诉我它是否有效以及您如何使用它:)

    【讨论】:

    • 我想在我自己的控制台应用程序中以编程方式执行此操作,因此我不想依赖使用外部工具。
    • 如果您要抑制的功能是由同一个工具提供的?
    • @Svish:我试图从我的代码中调用它,但它没有效果,因为它是在单独的控制台中启动的。看来我需要在代码中执行此操作才能将其应用于 current 控制台。
    • @adrianbanks - 对...是的,我想你可能会。你是怎么呼唤它的?有没有办法找出命令在后台执行的操作?就像我认为@Paul-Jan 指的是
    • @Svish:好吧,我现在有点困惑!我通过启动一个新进程来呼唤doskey。我还能如何从 C# 调用它?
    【解决方案2】:

    似乎根据MSN(http://msdn.microsoft.com/en-ie/library/system.console_members.aspx)方法console.clear()“清除控制台缓冲区..”

    【讨论】:

    • 他想清除命令历史记录,而不是控制台缓冲区(如果我理解正确的话)
    【解决方案3】:

    您可以尝试使用该属性

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

    【讨论】:

    • 我已经尝试过了,但它不允许我将值设置为零。
    • BufferHeight 是所有控制台输出的可滚动窗口。这就是为什么还有 BufferWidth。
    【解决方案4】:

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

    可以通过使用FreeConsole 释放当前控制台然后使用AllocConsole 分配一个新控制台来执行此操作。我假设它不会保留命令行历史记录。

    一般来说,如果您想使用 .Net Framework 不支持的控制台做一些事情,这个 MSDN 页面是一个不错的地方:Console Functions

    【讨论】:

    • 恐怕对历史没有任何作用。
    • @adrianbanks:是的,对你在做什么感到困惑(尽管至少我犯了一个与这个问题的其他答案不同的错误:))。我已经用另一种可能的解决方案更新了我的答案。
    【解决方案5】:

    看看SetConsoleHistoryInfo。根据文档,它仅适用于 Vista 及更高版本,所以我不确定它是否对您有帮助。

    【讨论】:

      【解决方案6】:

      此代码对我有用,可以清除命令历史记录。测试有限,不保证可移植性。

      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;
              }
          }
      }
      

      【讨论】:

      • 错误处理被删除并替换为返回以提高概念示例的可读性。
      • 这应该是正确的答案。它是 C# .NET 托管代码,它封装了 Win32 调用以完成您需要的操作。像这样的封装代码对于以编程方式实现 Win32 控制台功能是必要的,例如切换 EOL 换行、将控制台置于屏幕中心、锁定窗口更新等。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 2013-09-23
      • 1970-01-01
      • 2011-11-16
      相关资源
      最近更新 更多