17

C# 2.0 の Windows フォームまたはユーザー コントロールに DOS コンソールを埋め込むことはできますか?

Windows アプリが対話する必要がある従来の DOS 製品があり、Windows アプリケーション内で従来の製品のインスタンスを実行するように要求されました。

現在、user32.dll を使用して、DOS 製品が実行されているウィンドウを見つけ、ウィンドウを最小化してから最大化し、ウィンドウに文字を入力しています。これは、アプリケーションがウィンドウ名をアプリケーション設定に保存する必要があり、対話機能を使用する前にユーザーが DOS アプリの正しいページに戻る必要があることを意味するため、問題に対するあまり良い解決策ではありません。

編集:いくつかの詳細情報

レガシ アプリはユーザーに表示される必要がありますが、別のウィンドウでは表示されません。

私はTimothyPの答えを試してみましたが、非常にうまく機能しますが、同じ機能を実現することは可能ですが、独自のウィンドウにポップアップするのではなく、WindowsフォームまたはユーザーコントロールにDOSウィンドウを視覚的に埋め込んでいますか? できれば ShowDialog() の方法で、いわば「レガシー モード」でユーザーがアプリと対話できないようにします。

4

3 に答える 3

23

Process クラスを使用して、コンソール/DOS アプリケーションの標準入出力をリダイレクトすることができます。次のようになります。

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

ストリームを使用してアプリケーションとやり取りできるようになりました。processStartInfo.CreateNoWindow を true に設定すると、元のアプリケーションは非表示になります。

これが役立つことを願っています。

于 2008-12-10T11:26:11.237 に答える
4

Windowsアプリ内にDOSアプリを表示する方法についての質問について。

いくつかの解決策があります。

  • 1つ目は、DOSアプリを(CreateNoWindowを使用して)表示せず、ストリームの読み取りと書き込みを行うことで、WindowsアプリケーションでDOSアプリのUIを「シミュレート」することです。

  • もう1つの解決策は、Win32APIを使用し、コンソール/ DOSアプリケーションウィンドウのWindowsハンドル(Whnd)を取得して、その親をフォームに設定することです。私は現在家にいませんし、これをやってから何年も経っているので、それがどのように行われたかを心から思い出せません。私が間違っていない場合は、次のWin32API呼び出しを使用する必要があります。

今日の後半に時間があれば、もっと良いサンプルを見つけることができるかどうかを確認します。

于 2008-12-11T13:16:19.563 に答える
1

CreateProcess 関数と、STARTUPINFO 引数の hStdInput、Output、および Error メンバーを使用できます。これにより、アプリケーションの標準入力と出力をインターセプトできます。

于 2008-12-10T11:24:46.903 に答える