2015-09-18 9 views
5

Come si manipola la posizione del cursore della console in dotnet core?Come si manipola la posizione del cursore della console in dotnet core?

Per quanto posso vedere in https://github.com/dotnet/corefx/blob/master/src/System.Console/src/System/Console.cs non c'è modo di manipolare la posizione del cursore.

Significa che è impossibile su Windows e sarà possibile su linux tramite sequenze di escape ANSI?

+0

Vuoi spostare e controllare il mouse ecc.? – Slashy

+0

@Slash il cursore della console è il .... cursore nella finestra della console. L'OP sa cosa sta chiedendo. Le sequenze di escape dovrebbero funzionare anche in Windows BTW –

+0

@PanagiotisKanavos La Console di Windows non supporta sequenze di escape ANSI di per sé. [È necessario caricare alcuni "driver" personalizzati] (http://stackoverflow.com/a/16799175/21567). –

risposta

3

Nella classe ConsolePal si ha private static IntPtr OutputHandle (che è l'handle della console su cui si desidera spostare il cursore), quindi in questa classe è necessario esporre un metodo per impostare la posizione del cursore. In questo metodo è necessario chiamare l'API di sistema SetConsoleCursorPosition(IntPtr hConsoleOutput, COORD cursorPosition);. COORD è:

[StructLayout(LayoutKind.Sequential)] 
internal struct COORD 
{ 
    internal short X; 
    internal short Y; 
} 

È possibile aggiungere DllImport del metodo precedente Interop.mincore classe (perché sembra che sia qui, dove il sistema DllImport sono fatti), in modo da qualche parte dove si vuole si può:

internal partial class Interop 
{ 
    internal partial class mincore 
    { 
     [DllImport("kernel32.dll", SetLastError=true)] 
     internal static extern bool SetConsoleCursorPosition(IntPtr hConsoleOutput, COORD cursorPosition); 
    } 
} 

Il metodo per esporre in ConsolePal può assomigliare a questo:

public static void SetCursorPosition(int left, int top) 
{ 
    IntPtr consoleOutputHandle = OutputHandle; 
    COORD cursorPosition = new COORD { 
     X = (short) left, 
     Y = (short) top 
    }; 
    Interop.mincore.SetConsoleCursorPosition(consoleOutputHandle, cursorPosition; 
} 

Nota: aggiungere al metodo un po 'di controllo di input e un po' di controllo sulla Interop.mincore.SetConsoleCursorPosition valore restituito

E in Console classe semplicemente esporre un metodo che chiama ConsolePal.SetCursorPosition

public static void SetCursorPosition(int left, int top) 
{ 
    ConsolePal.SetCursorPosition(left, top); 
} 

non ho la prova il codice di cui sopra in modo che può contenere errori.

Modifica

Come detto @Jcl, potrebbe non essere invitati a utilizzare una versione personalizzata di .NET. In questo caso puoi scrivere una semplice classe per spostare il cursore (anche questa soluzione è solo per Windows):

static class MyAwesomeConsoleExtensions 
{ 
    [DllImport("kernel32.dll", SetLastError = true)] 
    private static extern IntPtr GetStdHandle(int nStdHandle); 
    [DllImport("kernel32.dll", SetLastError = true)] 
    private static extern bool SetConsoleCursorPosition(IntPtr hConsoleOutput, COORD cursorPosition); 
    [StructLayout(LayoutKind.Sequential)] 
    private struct COORD 
    { 
     internal short X; 
     internal short Y; 
    } 
    private const int STD_OUTPUT_HANDLE = -11; 

    public static void SetCursorPos(int left, int top) 
    { 
     IntPtr consoleOutputHandle = GetStdHandle(STD_OUTPUT_HANDLE); 
     COORD cursorPosition = new COORD 
     { 
      X = (short)left, 
      Y = (short)top 
     }; 
     SetConsoleCursorPosition(consoleOutputHandle, cursorPosition); 
    } 
} 
+1

Non dicendo che non è supportato (lo è davvero), ma diventare nativo con 'DllImport' e Win32 Api su .NET Core potrebbe non essere una buona idea – Jcl

+1

Funzionerebbe solo su Windows. Immagino che l'OP possa usare un'implementazione Linux (magari usando sequenze ANSI) in una classe diversa, proprio come .NET core fa con ConsolePal.Windows e ConsolePal.Unix.cs –

+0

@Jcl controlla il repository. ConsolePal * è * una classe Core con specializzazioni specifiche della piattaforma. ConsolePal.Windows.cs utilizza Interop e ConsolePal.Unix utilizza le chiamate POSIX –

Problemi correlati