2008-12-10 8 views
16

Est-il possible d'intégrer une console DOS dans un formulaire Windows ou un contrôle utilisateur dans C# 2.0?Intégration d'une console DOS dans un formulaire Windows

Nous avons un produit DOS hérité avec lequel mon application Windows doit interagir, et il a été demandé qu'une instance du produit hérité soit exécutée dans l'application Windows.

Pour l'instant, j'utilise le fichier user32.dll pour localiser la fenêtre dans laquelle s'exécute le produit DOS, en minimisant puis en agrandissant la fenêtre et en tapant des caractères dans la fenêtre. Ce n'est pas une très bonne solution au problème, car cela signifie que mon application doit stocker le nom de la fenêtre dans les paramètres de l'application, et exige que l'utilisateur retourne à la bonne page de l'application DOS avant d'utiliser la fonction d'interaction.

EDIT: Quelques informations supplémentaires

L'application héritage doit être visible à l'utilisateur, mais pas dans une fenêtre séparée. J'ai essayé la réponse de TimothyP et cela fonctionne très bien, mais est-il possible d'obtenir la même fonctionnalité, mais avec la fenêtre DOS visuellement incorporée dans un formulaire Windows ou un contrôle utilisateur au lieu d'apparaître dans sa propre fenêtre? De préférence dans un mode ShowDialog() de sorte que l'utilisateur ne peut pas interagir avec l'application, ils sont en «mode hérité», pour ainsi dire.

Répondre

22

Il est possible de rediriger l'entrée/sortie standard des applications console/dos à l'aide de la classe Process. Cela peut ressembler à ceci:

var processStartInfo = new ProcessStartInfo("someoldapp.exe", "-p someparameters"); 

processStartInfo.UseShellExecute = false; 
processStartInfo.ErrorDialog = false; 

processStartInfo.RedirectStandardError = true; 
processStartInfo.RedirectStandardInput = true; 
processStartInfo.RedirectStandardOutput = true; 
processStartInfo.CreateNoWindow = true; 

Process process = new Process(); 
process.StartInfo = processStartInfo; 
bool processStarted = process.Start(); 

StreamWriter inputWriter = process.StandardInput; 
StreamReader outputReader = process.StandardOutput; 
StreamReader errorReader = process.StandardError; 
process.WaitForExit(); 

Vous pouvez maintenant utiliser les flux pour interagir avec l'application. En définissant processStartInfo.CreateNoWindow sur true, l'application d'origine sera masquée.

J'espère que cela aide.

+0

Comment utiliser 'outputReader' avec une application qui s'exécute et sort constamment jusqu'à ce que l'utilisateur l'utilise? Quelque chose comme un serveur http nodejs, où il y a une nouvelle sortie de ligne chaque fois qu'une demande est faite? – Ace

1

Vous pouvez utiliser la fonction CreateProcess et les membres hStdInput, Output et Error de l'argument STARTUPINFO, ce qui vous permettra d'intercepter l'entrée et la sortie standard de l'application.

4

En ce qui concerne votre question sur la façon d'afficher l'application DOS dans l'application Windows.

Il existe quelques solutions.

  • Le premier est tout simplement pas afficher l'application DOS (avec CreateNoWindow) et « simuler » l'interface utilisateur de l'application DOS dans votre application Windows par la lecture et l'écriture aux cours d'eau.

  • L'autre solution consisterait à utiliser Win32API, obtenir le handle Windows (Whnd) de la fenêtre d'application console/DOS et définir son parent à votre formulaire. Je ne suis actuellement pas à la maison et depuis il y a longtemps que je l'ai fait, je ne peux pas me rappeler par cœur comment c'est fait.Si je ne me trompe pas, vous aurez besoin d'utiliser les appels API Win32 suivants:

Si j'ai un peu de temps plus tard aujourd'hui , Je vais voir si je peux trouver de meilleurs échantillons.

+0

Merci Timothy, j'ai déjà utilisé les appels API FindWindow et GetWindow, je vais regarder dans SetParent aujourd'hui. Merci encore pour votre aide! Espérons que je serai en mesure de retourner la faveur un jour. –

Questions connexes