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

20

我写了一个控制台应用程序,本质上是一个Console.ReadLine()循环。当应用程序等待输入时,按上箭头键会迭代所有先前输入的行。我的应用程序没有包含此功能的任何代码。Windows的哪个部分提供这个功能?我如何禁用它?

我只能想象这要么是控制台子系统的一个特性,要么是在Console.ReadLine()中实现的。

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

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

我想暂时禁用历史记录功能,稍后再使用自己的代码重新实现。目前的行为太受限制了。


我找到的唯一解决方案是这个 - http://www.clearallhistory.com/clear-run-history.html。虽然不是理想的解决方案,但你可以在要求输入之前清除历史记录。副作用是它会清除计算机上打开的任何命令提示符的历史记录。 - arunkumar
我也对此感到惊讶,因为这也发生在我身上,但我对此感到非常满意。我认为这很棒。但现在我想拦截Tab键来完成操作,如果我需要手动一个一个地获取按键,则似乎可能会失去该功能。这是个很酷的功能,但似乎不够可扩展。另外,为什么不一步到位,实现Ctrl-R历史记录查找呢?微软... - v.oddou
实际上,我偶然发现控制台支持 F8(bash Ctrl+r)和 F9(bash !n)! 这真是太棒了,向微软致敬。http://ss64.com/nt/syntax-keyboard.html - v.oddou
4个回答

20

+1 我一定是错过了那个API函数。我已经打开了那个页面 :-) 我想我不会再尝试禁用这个功能了。我将使用自己的输入处理方式,使用ReadKey()。这应该完全避开历史记录。 - TheFogger

4

历史记录功能是内置于Windows命令行壳程序中的,不是你的应用程序的特性。据我所知,在你的代码中无法禁用此功能,因为它是特定于Windows Shell环境的(除非有可以更改的设置,可能存在)。

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


问题在于你的回答并没有真正给他提供一种从程序上控制事物的方式,这只是对他设置的一种变通方法。理想情况下,他想要自己实现命令历史记录,因为他希望用自己的代码重新实现它。 - Jesus Ramos
喜欢那个踩票和三个几乎完全相同的答案。干得好,伙计们。 - Jesus Ramos
没关系,他们只是在“转推”答案。另一个挑战者出现了,再次给出相同的答案... - Jesus Ramos
这也适用于从VS或资源管理器启动控制台模式应用程序的情况。没有运行Windows命令shell。恐怕你的答案完全错误。 - Hans Passant
汉斯,那仍然运行Windows shell。@大卫,我告诉他可以处理向上箭头按键事件,这样他就可以使用自己的实现,而不是由shell处理向上箭头事件。 - Jesus Ramos
显示剩余6条评论

4
是的,这是控制台子系统的一个功能,而不是您的应用程序。要更改它,请单击控制台的控制框(左上角),属性,选项选项卡:“命令历史记录”。默认值为50个项目,4个缓冲区。据说可以使用DOSKEY从命令行进行程序配置,但几分钟的尝试没有进展。
按下ALT+F7将清除命令历史记录,执行命令DOSKEY /reinstall也会起到同样的作用。我在Windows 7中测试过。
更新:对应的Win32 API调用是SetConsoleHistoryInfo,p/invoke签名可以在http://pinvoke.net/default.aspx/kernel32/SetConsoleHistoryInfo.html中找到。

那个链接中的pinvoke是错误的。应该使用uints而不是ushorts,并且还需要将指针作为引用传递。 - Matthias

0

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

pinvoke.net上有P/Invoke定义。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接