standardinput未被重定向C#

时间:2011-05-08 13:58:18

标签: c# stdout stdin minecraft

所以我有一个进程(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";

3 个答案:

答案 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的论坛问问。