2011-09-27 3 views
13

Possible en double:
C# Advanced Console I/OModifier le texte dans l'application console C#?

est-il un moyen de modifier le texte dans une application console C#? En d'autres termes, est-il possible de placer du texte prédéfini sur la ligne de commande pour que l'utilisateur puisse modifier le texte et le soumettre à nouveau à l'application?

+4

Je ne crois pas que ma question soit un doublon de la question fournie. Mon besoin est beaucoup plus spécifique et la réponse donnée à cette question ne répond pas à cette question. La classe Console, pour autant que je sache, n'a rien pour aider à placer du texte éditable sur la ligne de commande. – Chev

+1

Il n'y a pas de ligne de commande dans une application de console sauf si vous en programmez une. Et cela peut être fait avec la classe Console. Edit: ligne cmd est le shell, ce que vous utilisez pour démarrer l'application console. Pendant qu'il s'exécute et que vous publiez des éléments dans la fenêtre de la console, vous n'utilisez pas de commandes shell, c'est-à-dire la ligne de commande. Vous auriez interprété la (les) touche (s) appuyée (s) et effectué des actions spécifiques en fonction de la touche (ie reculer le curseur d'un caractère lorsque vous appuyez sur la touche retour). » –

+1

@Alex Ford: Concernant« beaucoup plus spécifique » print int "est beaucoup plus spécifique que" comment imprimer un objet ", ne voyez aucune différence. – agibalov

Répondre

11

Une chose qui m'est venue à l'esprit est de ... simuler des frappes. Et un exemple simple en utilisant SendKeys:

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

NOTE: Cela ne fonctionne que sur la fenêtre active.

+1

Votre méthode est plus simple que la mienne. Il semble que j'aime inventer des bicyclettes :)) – Vasya

+0

Votre code est vraiment bon et vous n'inventez pas de bicyclette parce que dans ma solution suggérée devez utiliser l'espace de noms System.Windows.Forms ou PInvoke SendInput ou quelque chose de familier. +1 de moi :) – Reniuz

+0

Merci. C'est bien que nous considérions tous les deux les méthodes de l'autre. – Vasya

15

Oui. Vous devez utiliser la méthode SetCursorPosition de la console. Exemple:

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

Il affiche « enfer » Vous devez réaliser personnalisée de méthode ReadLine qui vous permettent d'éditer n-symboles (chaîne par défaut) dans la console et retour chaîne d'un utilisateur. Voici mon exemple:

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()); 
} 

Cette méthode affiche la chaîne Default. J'espère avoir bien compris votre problème (j'en doute)

+1

Pouvez-vous clarifier un peu? Je ne suis pas sûr de comprendre. J'ai placé ce code dans une nouvelle application de console et il affiche en effet "enfer" mais comment cela m'aide-t-il à éditer ce texte sur la ligne de commande? – Chev

+2

+1 pour ne pas avoir à référencer System.Windows.Forms –

+0

Bonne réponse. Très utile pour ceux qui ont des problèmes avec SendKeys! –

Questions connexes