Incorporation d’une console DOS dans un formulaire Windows

Est-il possible d’incorporer une console DOS dans un Windows Form ou un contrôle utilisateur en C # 2.0?

Mon application Windows doit interagir avec un produit DOS hérité. Il a été demandé à une instance du produit hérité de s’exécuter dans l’application Windows.

Pour le moment, j’utilise user32.dll pour localiser la fenêtre dans laquelle le produit DOS est exécuté, en minimisant puis en maximisant 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 parameters de l’application et nécessite que l’utilisateur revienne à la page correcte de l’application DOS avant d’utiliser la fonction d’interaction.

EDIT: Quelques informations supplémentaires

L’application existante doit être visible pour 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 intégrée dans un formulaire Windows ou un contrôle utilisateur au lieu de s’afficher dans sa propre fenêtre? De préférence, de manière ShowDialog () afin que l’utilisateur ne puisse pas interagir avec l’application, même s’il est en “mode hérité”, pour ainsi dire.

Il est possible de redirect l’entrée / sortie standard des applications console / dos à l’aide de la classe Process. Cela pourrait ressembler à quelque chose comme ça:

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 stream pour interagir avec l’application. En définissant processStartInfo.CreateNoWindow sur true, l’application d’origine sera masquée.

J’espère que ça aide.

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

Il y a quelques solutions.

  • La première consiste simplement à ne pas afficher l’application DOS (avec CreateNoWindow) et à “simuler” l’interface utilisateur de l’application DOS dans votre application Windows en lisant et en écrivant dans les stream.

  • L’autre solution consiste à utiliser Win32API, à obtenir le descripteur Windows (Whnd) de la fenêtre de l’application Console / DOS et à définir son parent sur votre formulaire. Je ne suis pas à la maison et comme cela fait longtemps que je n’ai pas fait cela, je ne me souviens plus par cœur de la façon dont cela s’est passé. Si je ne me trompe pas, vous devrez utiliser les appels suivants de l’API Win32:

    • FindWindow
    • GetWindow
    • SetParent

S’il me rest du temps plus tard aujourd’hui, je verrai si je peux trouver de meilleurs échantillons.

Vous pouvez utiliser la fonction CreateProcess et les membres hStdInput, Output et Error de l’argument STARTUPINFO pour vous permettre d’intercepter les entrées et sorties standard de l’application.