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

我写了一个控制台应用程序,它本质上是一个Console.ReadLine() – Loop。 当应用程序正在等待input时,按向上箭头键迭代所有以前的input行。 我的应用程序不包含此function的任何代码。 Windows提供了哪些内容? 我怎样才能禁用它?

我只能想象它是控制台子系统的一个function,或者在Console.ReadLine()中实现。

以下是一些展示所描述行为的示例代码:

namespace ConsoleApplication { class Program { static void Main(string[] args) { string input; do { input = System.Console.ReadLine(); } while (input != "exit"); } } } 

我想现在禁用历史loggingfunction,稍后使用我自己的代码重新实现它。 目前的行为太有限了。

Solutions Collecting From Web of "为什么我的控制台应用程序有命令历史?"

你可以通过调用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问题

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

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

是的,这是控制台子系统的功能,而不是您的应用程序。 要改变它,点击控制台的控制框(左上角),属性,选项标签:“命令历史”。 默认是50个项目,4个缓冲区。 据说这可以用DOSKEY从命令行以编程方式进行配置,但几分钟的修补并没有引导我到任何地方。

ALT+F7将清除命令历史记录,同时执行命令DOSKEY /reinstall 。 我在Windows 7中测试。

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

没有经过测试,但它看起来像传递一个CONSOLE_HISTORY_INFO实例SetConsoleHistoryInfo与缓冲区大小和计数设置为1将给与控制台窗口属性对话相同的控制。

P /调用定义在pinvoke.net

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