Blog d'Emmanuel Istace

Rediriger les flux d’entrées et de sorties de la console

Posted in DotNet, Programmation by Emmanuel Istace on 13 septembre 2011


Voici comment faire pour fournir un fichier en entrée a un programme et rediriger la sortie.
Voici ce que fait notre programme :

    string input = "";
    while ((input = Console.ReadLine()) != null) Console.WriteLine(input);

Il lit une entrée et la réécrit.

La classe console à deux attributs, in et out. Ces deux attributs sont des TextWritter/Reader. Ils peuvent être définis avec les méthodes Set associée (SetIn() et SetOut())
Nous allons maintenant faire en sorte de passer le nom d’un fichier en argument pour l’input. La sortie sera ensuite écrite dans un fichier du même nom, suffixé par « .out ».

TextReader oldtr = Console.In;
TextWriter oldtw = Console.Out;

try
{
    TextReader tr = new StreamReader(args[0]);
    TextWriter tw = new StreamWriter((args[0] + ".out"));

    Console.SetIn(tr);
    Console.SetOut(tw);

    string input = "";
    while ((input = Console.ReadLine()) != null) Console.WriteLine(input);

    tw.Flush();
}
catch (Exception e)
{
    Console.SetIn(oldtr);
    Console.SetOut(oldtw);
    Console.WriteLine(e.Message);
}

On sauvegarde tout d’abord nos anciens stream. Ensuite dans un try/catch on exécute la lecture du fichier. Les exceptions sont très mal gérées, mais ce n’est pas le but de l’article. La sauvegarde nous permet de reprendre la main sur les stream originaux (clavier/ecran) au cas où.
Notre boucle s’exécutera jusqu’au EOF (ReadLine() retournera null). Ensuite on flush le stream afin de tout commiter dans le fichier défini dans le constructeur du StreamWritter. Il n’est pas nécéssaire d’appeler Close(). La console le fera pour vous a sa fermeture. (Les close() s’executerons sur les propriétées in/out que l’on à défini)
Voilà, maintenant vous pouvez « automatiser via des scripts » vos applications consoles en dotnet.

Tagged with: , , ,

Créer une Console Application invisible en C#

Posted in DotNet, Programmation by Emmanuel Istace on 22 mai 2011

Salut a tous, pour les besoins d’un projet je devais pouvoir rendre une fenêtre console invisible a l’utilisateur pour des questions d’ergonomie.

Voici donc un petit bout de code utilisant de l’interop user32 pour réaliser cela .

Voici donc les imports :

[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

FindWindow vas nous permettre d’obtenir un pointeur sur notre fenêtre, ShowWindow vas nous permettre d’activer ou désactiver la fenêtre.

On récupère donc un pointeur sur notre fenêtre avec en second argument le caption name, dans mon cas le path d’execution :

IntPtr hWnd = FindWindow(null, System.Windows.Forms.Application.ExecutablePath);

Ensuite on peut afficher la window avec 1 en second argument et le pointeur en premier :

if (hWnd != IntPtr.Zero)
{
ShowWindow(hWnd, 1);
}

Ou la render invisible avec 0 en second argument :

if (hWnd != IntPtr.Zero)
{
ShowWindow(hWnd, 0);
}

En espérant que cela vous sera utile ^^

Inform@tiquement
Istace Emmanuel

Tagged with: , ,
Suivre

Get every new post delivered to your Inbox.

Joignez-vous à 31 followers