Mono で GTK# を使用して、"dh_make" シェル コマンドを実行しようとしています。問題は次のとおりです: dh_make は、プロセスが動作を開始するためにキーを押す必要があります。C#でできるかどうかはわかりません。手伝って頂けますか?
3 に答える
はい、ユーザーからの入力としてプロセスへの「入力」を押すことをエミュレートすることは間違いなく可能です。次のコードは、dh_make を別のプロセスとして開始し、その標準入力を作成プロセスの出力に送り、入力として 'enter' を dh_make プロセスに送信することによって、まさにそれを行います。
System.Diagnostics.Process myProcess = new System.Diagnostics.Process();
myProcess.StartInfo.FileName = "dh_make";
myProcess.StartInfo.Arguments = "(put here any command line arguments you need)";
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.RedirectStandardInput = true;
myProcess.Start();
System.IO.StreamWriter myStreamWriter = myProcess.StandardInput;
// The following will put an 'Enter' on the first dh_make request for user input
myStreamWriter.WriteLine(" ");
現在、いくつかのコードでこれを使用していますが、非常にうまく機能します。
それが役立つことを願っています!
process.StartInfo.WorkingDirectory = "'/home/"+user+"/pacotes/"+nome_pacote.Text+"-1.0/'";
process.StartInfo.FileName="dh_make";
process.StartInfo.Arguments="-n -s";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.Start();
System.IO.StreamWriter myStreamWriter = process.StandardInput;
myStreamWriter.WriteLine(" ");
process.WaitForExit();
デバッグ時に、次のエラーが発生しました: 奇数文字 '>'、要素 'filename の属性名 'unknown' の後に '=' が必要です。何ができるか知っていますか?
コメントしたように、 g_spawn_async_with_pipesdh_make
を使用してプロセスと通信するパイプが必要です。Gtk では、おそらくメイン イベント ループをマスターし、 g_child_watch_addで子ウォッチングを追加し、g_io_add_watchでチャネル ウォッチングを追加する必要があります。おそらく 2 つのチャネル (つまり、パイプ) を使用する必要があります。1 つは入力用で、もう 1 つは出力用です。dh_make
パイプとは何かを正確に理解していない場合は、優れた高度な Linux プログラミングまたは高度な UNIX プログラミングの本を読むことを検討してください。Gtk のメイン ループは、多重化ポーリングを行っています。
これらの低レベルの Gtk/Glib 関数がどのように Gtk# に接着されているかを理解したい場合は、Gtk#のドキュメントを調べて、最終的にそのソース コードの内部を調べます (おそらくgrep
のソース コードを使用しますGtk#
)。Gtk# には、それに関連するテスト、デモ、またはサンプル コードが含まれている可能性があります。