したがって、出力と入力がリダイレクトされて非表示になっているプロセス(Javaコマンドラインアプリケーション)があります。出力を非常に簡単に読み取ることができ、それは機能しますが、コマンドを送信すると機能しません。
次の理由により、入力がリダイレクトされていないと判断したと思います。
(A)コマンドを送信WriteLine(//command here); Flush
しても、プログラムによって確認応答がありません
(B)cmdウィンドウを再表示すると(StartInfo.CreateNoWindow = false;
)StandardInputがリダイレクトされている場合でも、コマンドを入力して(cmdウィンドウで)実行できます(StartInfo.RedirectStandardInput = true;
)
コードは次のとおりです。
namespace bukkit
{
public partial class Form1 : Form
{
private static StringBuilder _txt = new StringBuilder();
private static bool _scrolled = false;
Process mncrft = new Process();
public Form1()
{
InitializeComponent();
mncrft.StartInfo.WorkingDirectory = Path.GetTempPath();
mncrft.StartInfo.Arguments = "-Xmx512M -Xms512M -jar C:\\mncrft\\mncrft.jar";
mncrft.StartInfo.FileName = "java.exe";
mncrft.StartInfo.UseShellExecute = false;
mncrft.StartInfo.RedirectStandardOutput = true;
mncrft.StartInfo.RedirectStandardError = true;
mncrft.StartInfo.RedirectStandardInput = true;
mncrft.StartInfo.CreateNoWindow = false;
mncrft.ErrorDataReceived += build_ErrorDataReceived;
//mncrft.OutputDataReceived += build_ErrorDataReceived;
mncrft.EnableRaisingEvents = true;
//mncrft.StandardInput.NewLine = "\r\n";
mncrft.Start();
mncrft.BeginOutputReadLine();
mncrft.BeginErrorReadLine();
}
private void Form1_Load(object sender, EventArgs e)
{
_txt.AppendLine("Starting Minecraft...");
}
private void Form1_Close(object sender, EventArgs e)
{
mncrft.Close();
}
static void build_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
string msg = e.Data;
if (msg != null && msg.Length > 0)
{
_txt.AppendLine(msg);
_scrolled = false;
}
}
private void mainTimer_Tick(object sender, EventArgs e)
{
if (_txt.Length > 0)
{
txtOutput.Text = _txt.ToString();
// scroll down
if (_scrolled == false)
{
txtOutput.SelectionStart = txtOutput.Text.Length;
txtOutput.ScrollToCaret();
_scrolled = true;
}
}
}
private void Execute_Click(object sender, EventArgs e)
{
if (textBox1.Text.Length > 0)
{
mncrft.StandardInput.WriteLine(textBox1.Text);
mncrft.StandardInput.Flush();
}
}
}
}
コマンドを送信できるように入力をリダイレクトするにはどうすればよいですか?
ありがとう、アダム
PS:これが紛らわしい場合は、コメントを書いてください。喜んで明確にします。
答えた
ティムのおかげで、次の行を置き換えます。
mncrft.StartInfo.FileName = "java.exe";
mncrft.StartInfo.Arguments = "-Xmx512M -Xms512M -jar C:\\mncrft\\mncrft.jar";
と:
mncrft.StartInfo.FileName = "java";
mncrft.StartInfo.Arguments = "-Xmx512M -Xms512M -jar C:\\mncrft\\bukkit.jar -nojline";