将控制台中的输入光标移动到下一行

时间:2013-07-25 18:22:30

标签: c# multithreading input console output

这是一个有两个线程的程序;一个用于输出,一个用于输入。 (其中_是控制台光标)

Please enter a number:
12_

当您输入12时,会生成输出,清除当前行并将其写入,因此会发生这种情况:

Please enter a number:
Output
_

如何才能使你仍然进入的12并将其移至下一行,这样你就不必重新输入它了?

提前致谢。

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)
        {
            Program prog = new Program();
            Thread t1 = new Thread(prog.getInput);
            t1.Start();
            prog.otherThread();
        }

        public void otherThread()
        {
            while (true)
            {
                System.Threading.Thread.Sleep(3000);
                ClearCurrentConsoleLine();
                Console.WriteLine("Output");
            }
        }

        public void getInput()
        {
            while (true)
            {
                string msg;
                msg = Console.ReadLine();
            }
        }

        public static void ClearCurrentConsoleLine()
        {
            int currentLineCursor = Console.CursorTop;
            Console.SetCursorPosition(0, Console.CursorTop);
            for (int i = 0; i < Console.WindowWidth; i++)
            {
                Console.Write(" ");
            }
            Console.SetCursorPosition(0, currentLineCursor);
        }
    }

如您所见,当您输入“Hello”且不输入时,3秒后它将被“输出”覆盖。我希望在被覆盖之前将“Hello”和输入移动到第二行。

2 个答案:

答案 0 :(得分:1)

我刚刚发现了articleweb archive),其中讨论了光标位置和修改。我发现它很直接。

它的中心片段是:

      int left = Console.CursorLeft;
      int top = Console.CursorTop;
      Console.SetCursorPosition(15, 20);

答案 1 :(得分:0)

如果我理解正确,这应该有用。

  1. 制作字符串msg Global。在所有函数之外声明它。
  2. 现在只需在清除上一行后在下一行打印..

    课程计划 {
        string msg;

    static void Main(string[] args)
    {
        Program prog = new Program();
        Thread t1 = new Thread(prog.getInput);
        t1.Start();
        prog.otherThread();
    }
    
    public void otherThread()
    {
        while (true)
        {
            System.Threading.Thread.Sleep(3000);
            ClearCurrentConsoleLine();
            Console.WriteLine("Output");
        }
    }
    
    public void getInput()
    {
        while (true)
        {
    
            msg = Console.ReadLine();
        }
    }
    
    public static void ClearCurrentConsoleLine()
    {
        int currentLineCursor = Console.CursorTop;
        Console.SetCursorPosition(0, Console.CursorTop);
        for (int i = 0; i < Console.WindowWidth; i++)
        {
            Console.Write(" ");
        }
    
        Console.SetCursorPosition( 0, currentLineCursor + 1 );
        Console.Write(msg);
        Console.SetCursorPosition(0, currentLineCursor);
    
    }
    

    }