我编写了一个控制台应用程序,它本质上是一个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");
}
}
}
我想暂时禁用历史记录功能,稍后使用我自己的代码重新实现它。目前的行为太有限了。
答案 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将提供与控制台窗口属性对话框相同的控件。
另请注意,这需要Windows V6或更高版本(即Vista / 2008/7 / 2008R2)。