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);
}
}
Vuoi spostare e controllare il mouse ecc.? – Slashy
@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 –
@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). –