为什么我的控制台应用程序有命令历史?

时间:2011-08-07 14:02:25

标签: c# .net windows console console-application

我编写了一个控制台应用程序,它本质上是一个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 个答案:

答案 0 :(得分:20)

您可以通过使用正确设置SetConsoleHistoryInfo结构调用CONSOLE_HISTORY_INFO以编程方式更改Windows的此行为...似乎没有托管类/方法,因此您必须使用{{1}等等。

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

答案 1 :(得分:4)

历史记录功能内置于Windows Command shell中,它不是您的应用程序的功能。 AFAIK没有办法在你的代码中禁用它,因为它特定于Windows Shell环境(除非有可以更改的设置,可能存在)

您可以通过使用键侦听器来覆盖默认行为,以获取所有向上箭头按键并执行您自己的代码,这样事件就不会下拉到shell来处理。

答案 2 :(得分:4)

是的,这是控制台子系统的一项功能,而不是您的应用程序。要更改它,请单击控制台的控制框(左上角),属性,选项选项卡:“命令历史记录”。默认值为50个项目,4个缓冲区。据说这可以通过命令行中的DOSKEY以编程方式进行配置,但是几分钟的修改并没有把我带到任何地方。

ALT+F7将清除命令历史记录,执行命令DOSKEY /reinstall也是如此。我在Windows 7中测试过。

更新:相应的Win32 API调用是SetConsoleHistoryInfo,p / invoke签名可以在http://pinvoke.net/default.aspx/kernel32/SetConsoleHistoryInfo.html找到

答案 3 :(得分:0)

未经过测试,但看起来将CONSOLE_HISTORY_INFO的实例传递给SetConsoleHistoryInfo并将缓冲区大小和count设置为1将提供与控制台窗口属性对话框相同的控件。

pinvoke.net

处调用/调用定义

另请注意,这需要Windows V6或更高版本(即Vista / 2008/7 / 2008R2)。