2011-09-27 9 views
13

Duplicar posibles:
C# Advanced Console I/O¿Editar texto en la aplicación de consola C#?

¿Hay una manera de editar el texto en una aplicación de consola de C#? En otras palabras, ¿es posible colocar texto predefinido en la línea de comando para que el usuario pueda modificar el texto y luego volver a enviarlo a la aplicación?

+4

No creo que mi pregunta sea un duplicado de la pregunta proporcionada. Mi necesidad es mucho más específica y la respuesta dada sobre esa pregunta no responde a esta pregunta. La clase de consola, por lo que yo sé, no tiene nada que lo ayude a colocar texto editable en la línea de comando. – Chev

+1

No hay línea de comando en una aplicación de consola a menos que programe uno. Y eso se puede hacer con la clase de la consola. Editar: la línea de cmd es el shell, lo que usas para iniciar la aplicación de la consola. Mientras se está ejecutando y está enviando material a la ventana de la consola, no está utilizando comandos de shell, es decir, la línea de comandos. Habría interpretado la (s) tecla (s) que se han presionado y realizará acciones específicas dependiendo de la tecla (es decir, mover el cursor hacia atrás una vez cuando se presiona la tecla de retroceso). –

+1

@Alex Ford: En relación con "mucho más específico" - "¿cómo puedo print int "es mucho más específico que" cómo imprimo el objeto ", no veo diferencia. – agibalov

Respuesta

11

Una cosa que me vino a la mente es ... simular las pulsaciones de teclas. Y un ejemplo simple que utiliza SendKeys:

static void Main(string[] args) 
{ 
    Console.Write("Your editable text:"); 
    SendKeys.SendWait("hello"); //hello text will be editable :) 
    Console.ReadLine(); 
} 

NOTA: Esto sólo funciona en la ventana activa.

+1

Su método es más simple que el mío. Parece que me gusta inventar bicicletas :)) – Vasya

+0

Su código es realmente bueno y usted no inventa la bicicleta porque en mi solución sugerida necesita usar el espacio de nombres System.Windows.Forms o PInvoke SendInput o algo familiar. +1 de mí :) – Reniuz

+0

Gracias. Es bueno que ambos consideremos los métodos el uno del otro bien. – Vasya

15

Sí. Debe usar el método SetCursorPosition of Console. Ejemplo:

Console.WriteLine("hello"); 
    Console.SetCursorPosition(4, 0); 
    Console.WriteLine("  "); 

Se mostrará 'infierno' Es necesario la realización del encargo método ReadLine que le permiten editar n-símbolos (por defecto) en la cadena de consola y cadena de retorno de un usuario. Este es mi ejemplo:

static string ReadLine(string Default) 
{ 
    int pos = Console.CursorLeft; 
    Console.Write(Default); 
    ConsoleKeyInfo info; 
    List<char> chars = new List<char>(); 
    if (string.IsNullOrEmpty(Default) == false) { 
     chars.AddRange(Default.ToCharArray()); 
    } 

    while (true) 
    { 
     info = Console.ReadKey(true); 
     if (info.Key == ConsoleKey.Backspace && Console.CursorLeft > pos) 
     { 
      chars.RemoveAt(chars.Count - 1); 
      Console.CursorLeft -= 1; 
      Console.Write(' '); 
      Console.CursorLeft -= 1; 

     } 
     else if (info.Key == ConsoleKey.Enter) { Console.Write(Environment.NewLine); break; } 
     //Here you need create own checking of symbols 
     else if (char.IsLetterOrDigit(info.KeyChar)) 
     { 
      Console.Write(info.KeyChar); 
      chars.Add(info.KeyChar); 
     } 
    } 
    return new string(chars.ToArray()); 
} 

Este método mostrará la cadena Por defecto. Espero haber entendido bien tu problema (lo dudo)

+1

¿Puede aclarar un poco? No estoy seguro de entender. Coloqué este código en una nueva aplicación de consola y de hecho muestra "infierno", pero ¿cómo me ayuda esto a editar ese texto en la línea de comandos? – Chev

+2

+1 por no tener que hacer referencia a System.Windows.Forms –

+0

Great answer. ¡Muy útil para aquellos que están teniendo problemas con SendKeys! –

Cuestiones relacionadas