-1

Mono で GTK# を使用して、"dh_make" シェル コマンドを実行しようとしています。問題は次のとおりです: dh_make は、プロセスが動作を開始するためにキーを押す必要があります。C#でできるかどうかはわかりません。手伝って頂けますか?

4

3 に答える 3

4

はい、ユーザーからの入力としてプロセスへの「入力」を押すことをエミュレートすることは間違いなく可能です。次のコードは、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(" "); 

現在、いくつかのコードでこれを使用していますが、非常にうまく機能します。

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

于 2012-09-01T05:02:12.933 に答える
1
        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' の後に '=' が必要です。何ができるか知っていますか?

于 2012-10-28T20:19:00.450 に答える
1

コメントしたように、 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# には、それに関連するテスト、デモ、またはサンプル コードが含まれている可能性があります。

于 2012-07-30T05:22:25.123 に答える