如何在不中断用户输入的情况下更新C#Windows控制台应用程序中的行?

时间:2010-10-11 20:30:53

标签: c# console readline

在C#中构建Windows控制台应用程序时,是否可以在用户输入文本时更新控制台中的行?

我目前的代码是:

    public static void Scope()
    {
        bool stop = false;
        ASCOM.Utilities.Chooser chooser = new ASCOM.Utilities.Chooser {DeviceType = "Telescope"};
        ASCOM.Interface.ITelescope scope = new ASCOM.DriverAccess.Telescope(chooser.Choose());
        scope.Connected = true;
        ThreadPool.QueueUserWorkItem(
            cb =>
            {
                do
                {
                    Console.WriteLine("RA:     " + scope.RightAscension);
                    Console.WriteLine("Dec:    " + scope.Declination);
                    Console.WriteLine("Status: " + scope.Slewing);
                    Console.SetCursorPosition(0, Console.CursorTop - 3);
                    Thread.Sleep(1000);
                } while (!stop);
            }
        );
        Console.Read();
        stop = true;
    }

1 个答案:

答案 0 :(得分:1)

我建议将其从控制台应用程序更改为Windows应用程序,并将报告放入标准GUI。

这样,您就可以将屏幕的用户输入区域与报告分开,并提供更好,更实用的界面。


话虽如此,您可以明确地定位光标,并避免“中断”用户(比刷新方法调用更长)。但这需要付出很多努力。

键是按键读取控制台输入键(而不是使用ReadLine),因为您需要能够“重新键入”用户以前的输入。

当需要刷新显示时,您可以获取当前行的当前光标位置和内容,清除控制台,编写新文本,写入已经显示的任何文本(用户当前输入) ,并使用Console.SetCursorPosition显式设置光标位置。

如果您打算这样做,可能会提前将光标位置设置到控制台的最后一行(实际上是制作控制台模式gui)。这将使您至少能够提供旧式控制台应用程序的效果,并使用户不那么感到惊讶。