views:

51

answers:

1

When building a Windows Console App in C#, is it possible to update lines in the console while the user is entering text?

My current code is:

    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  A: 

I would recommend changing this from a Console application to a Windows application, and putting the reporting into a standard GUI.

This will let you have user input areas of your screen separate from your reporting, and provide a much nicer, more usable interface overall.


That being said, you could potentially position the cursor explicitly, and avoid "interrupting" the user (for longer than your refresh method call). This would require a lot of effort, though.

The keys would be to read the console input key by key (instead of using ReadLine), as you'd need to be able to "retype" the user's previous input.

When it's time to refresh the display, you could get the current cursor position and content for the current line, clear the console, write your new text, write in any text that would have been displaying already (the user's current input), and use Console.SetCursorPosition to explicitly set the cursor location.

If you're going to do that, it might be nice to, up front, set the cursor position to the last line of the console (in effect making a console-mode gui). This would allow you to at least give the effect of an old-school console application, and make this less surprising to the user.

Reed Copsey
That'd be a good idea, but I would like to see if it is possible.
Arlen Beiler
@Arlen: Edited to show you one approach...
Reed Copsey
One of the properties of the olden green-screens was that their phosphor had a very long persistence. It would glow for a while after the pixel got illuminated, very desirable when you start flicking the cursor around. That's not the way modern screens work, they try to make it very short so that video and animations play back well. In other words, the proposed solution will flicker like a cheap motel.
Hans Passant
@Hans: Yeah, it's imperfect - you could improve it by moving the cursor position and overwriting values one by one, but it still is crap compared to using a real GUI. However, if you need this to run in a console for some reason, it would at least work...
Reed Copsey
One thing to watch out for is how many lines the user has entered. That can mess you up depending on how you are doing it.
Arlen Beiler
Thanks, your a great help. I got it working (without any flicker). I used writeline to overwrite it.
Arlen Beiler