Terminal: Die Cursorform wird auf den alten Stil zurückgesetzt, nachdem der Cursor ausgeblendet und dann im Konsolenfenster wieder sichtbar gemacht wurde

Erstellt am 6. Jan. 2020  ·  3Kommentare  ·  Quelle: microsoft/terminal

Umgebung

Windows build number: Microsoft Windows [Version 10.0.18363.535]
Windows Terminal version (if applicable): NA

Any other software? No

Schritte zum Reproduzieren

Nachdem Sie die Cursorform in Properties->Terminal , wird die Cursorform wiederhergestellt, indem Sie den Cursor ausblenden und dann anzeigen, indem Sie Console.CursorVisible auf false und dann true der Legacy-Stil im Konsolenhost.

Das folgende einfache C # -Programm kann das Problem anzeigen:

using System;
using System.Text;

namespace cursorShape
{
    class Program
    {
        static void Main(string[] args)
        {
            const string prompt = "PROMP> ";
            StringBuilder sb = new StringBuilder();
            int top = Console.CursorTop;

            Console.OutputEncoding = Encoding.UTF8;
            Console.Write(prompt);

            while (true)
            {
                var key = Console.ReadKey();
                if (key.Key == ConsoleKey.Q)
                {
                    break;
                }

                sb.Append(key.KeyChar);

                Console.CursorVisible = false;   // Hide the cursor before rewriting
                Console.SetCursorPosition(0, top);
                Console.Write($"{prompt}{sb}");
                Console.SetCursorPosition(Console.CursorLeft, top);
                Console.CursorVisible = true;    // Show the cursor afterwards
            }
        }
    }
}

Erwartetes Verhalten

Das Setzen von Console.CursorVisible sollte die Cursorform nicht zurücksetzen.

Tatsächliches Verhalten

Die Cursorform wird von Solid Box auf den Legacy-Stil zurückgesetzt ( Underline ):
linux

Verwandte Themen

409 und # 1145 und https://github.com/PowerShell/PSReadLine/issues/903

Diese beiden Probleme wurden im PowerShell + PSReadLine-Kontext gemeldet. PSReadLine hängt von Console.CursorVisible , um den Cursor während des Renderns auszublenden und anzuzeigen, sodass die Cursorform zurückgesetzt wird.

Area-Settings Issue-Bug Needs-Tag-Fix Product-Conhost Resolution-Fix-Committed

Hilfreichster Kommentar

: tada: Dieses Problem wurde in # 5251 Windows Terminal Preview v0.11.1121.0 .: tada:

Praktische Links:

Alle 3 Kommentare

Zum Teufel.

Wie in # 409 erläutert, besteht das Problem darin, dass durch Aufrufen von SetConsoleCursorInfo die Cursorgröße festgelegt wird und durch Festlegen der Cursorgröße die Cursorform auf den alten Stil zurückgesetzt wird (da dies die einzige Form ist, für die die Größe AFAIK gilt ).

Es ist einfach genug, "zu reparieren". Wir könnten diese Zeile einfach aus der SetCursorInformation -Methode löschen:
https://github.com/microsoft/terminal/blob/6f667f48ae109d4291cda1f8d4e977315c0dae8a/src/host/screenInfo.cpp#L1778

Dies ist jedoch eine Verhaltensänderung für eine öffentliche API, und es ist möglich, dass sich einige Anwendungen tatsächlich auf dieses Verhalten verlassen (obwohl ich dies für unwahrscheinlich halte).

Idealerweise sollte die Eigenschaft Console.CursorVisible eine API verwenden, die nur die Sichtbarkeit und nichts anderes festlegt, aber ich glaube nicht, dass es so etwas gibt. Das Beste, was Sie tun können, ist die Verwendung einer VT-Sequenz, aber das funktioniert offensichtlich nicht mit älteren Windows-Versionen.

: tada: Dieses Problem wurde in # 5251 Windows Terminal Preview v0.11.1121.0 .: tada:

Praktische Links:

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen