我正在开发一个c#控制台应用程序。
我必须在指定光标位置的屏幕上显示一个计时器,同时用户应输入一些东西。
我该怎么做?
Console.SetCursorPosition(x, y);
//timer code here
Console.SetCursorPosition(x, y); // cursor goes to some other location because timer is displayed at top-right of the screen.
我的问题是这个方法不同步。 我必须等到光标移动到该位置然后显示时间并返回以便我可以输入。
答案 0 :(得分:0)
即使在阅读一行时也可以使用Timer。有关工作示例,请参阅下面的代码:
class Program
{
private static System.Timers.Timer _timer;
static void Main( string[] args )
{
_timer = new System.Timers.Timer( 1000 );
_timer.Elapsed += Timer_Elapsed;
_timer.AutoReset = true;
_timer.Start();
Console.CursorLeft = 0;
Console.CursorTop = 5;
// Type something here...
var l_readline = Console.ReadLine();
// Print it out... (to show it correctly reads the input)
Console.WriteLine( l_readline );
Console.ReadKey( true );
}
private static void Timer_Elapsed( object sender, System.Timers.ElapsedEventArgs e )
{
int l_left = Console.CursorLeft;
int l_top = Console.CursorTop;
Console.CursorLeft = 0;
Console.CursorTop = 0;
Console.Write( DateTime.Now.ToLongTimeString() );
Console.CursorLeft = l_left;
Console.CursorTop = l_top;
}
}
只要在完成后将光标位置重置回原位,我认为大多数输入形式都不会有太多麻烦。
答案 1 :(得分:0)
处理这类事情的最简单方法是存储当前的光标(X,Y),将时间写入时间(X,Y),然后将光标设置回光标(X,Y)。
private const int TIME_LEFT = 40;
private const int TIME_RIGHT = 2;
private void WriteTime() {
var left = Console.CursorLeft;
var right = Console.CursorTop;
try {
Console.SetCursorPosition(TIME_LEFT, TIME_RIGHT);
Console.Write(DateTime.Now);
} finally {
Console.SetCursorPosition(left, right);
}
}
不知道你在做什么,这是我给你的最佳建议。
这应该比人类可以做出的反应更快。