所以我有一个进程(java命令行应用程序),它被隐藏,输出和输入被重定向。我可以非常轻松地阅读输出,但是当我发送命令它不起作用时。
我认为我已确定输入未被重定向,因为:
(A)当我发送WriteLine(//command here); Flush
时,程序不会确认命令
(B)当我取消隐藏cmd窗口(StartInfo.CreateNoWindow = false;
)时,我可以输入命令并运行它们(在cmd窗口中),即使正在重定向StandardInput(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();
}
}
}
}
如何重定向输入以便我可以发送命令?
谢谢, 亚当
P.S:如果这令人困惑,只需发表评论,我将很乐意澄清。回答
感谢蒂姆, 替换以下行:
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";
答案 0 :(得分:4)
好的,我整天都在弄乱这个,我找到了答案。当您使用应用程序启动bukkit时,您需要在流程参数中包含“-nojline”。这使得bukkit的输入与标准输入一起正常工作。
https://github.com/Bukkit/CraftBukkit/commit/22a44d47ac48fb65bb61fb823c84bff9494f5033
答案 1 :(得分:0)
亚当 我不确定你的问题的答案,但我在过去确实有类似的问题,并了解到winform应用程序在stdin和stdout与控制台时的行为略有不同。我在使用对AttachConsole的API调用(以及释放它的FreeConsole)在线阅读一些帖子后解决了我的问题。也许这将是一个很好的起点,可以作为解决问题的方法进行调查。
[DllImport("kernel32.dll")]
static extern bool AttachConsole(int dwProcessId);
答案 2 :(得分:0)
这很奇怪,因为如果输入流没有重定向(由于某种原因),那么当你尝试对Process.StandartInput属性做任何事情时你会得到一个异常,如果它真的重定向那么你就不会无法在cmd窗口中输入命令并执行它们!
如果问题是因为你正在制作一个WinForms应用程序(正如Fadrian所提到的那样),那么尝试将其作为WPF应用程序(我个人更喜欢WPF而不是WinForms),如果你从未编写过WPF应用程序,那么请下载我链接的代码在我的博客帖子here(是的,您之前访问过的那个)并修改它以便它加载您的Bukkit服务器而不是常规的Minecraft服务器,如果它不起作用那么问题可能在于Bukkit服务器那时我建议你去Bukkit的论坛问问。