стандартный ввод не перенаправляется C # - PullRequest
2 голосов
/ 08 мая 2011

Итак, у меня есть процесс (приложение командной строки 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();
        }
    }
}
}

Как я могу перенаправить ввод, чтобы я мог отправлять команды?

Спасибо, Адам

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";

Ответы [ 3 ]

4 голосов
/ 13 июля 2011

Хорошо, я весь день возился с этим и нашел ответ.Когда вы запускаете Bukkit с вашим приложением, вам нужно включить '-nojline' в Аргументы вашего процесса.Благодаря этому входы bukkit корректно работают со стандартным входом.

https://github.com/Bukkit/CraftBukkit/commit/22a44d47ac48fb65bb61fb823c84bff9494f5033

0 голосов
/ 12 мая 2011

Это очень странно, потому что если входной поток не перенаправляет (по какой-то причине), вы получите исключение в тот момент, когда вы попытаетесь что-либо сделать со свойством Process.StandartInput, и если он действительно перенаправит вас, вы не сможетеневозможно вводить команды в окне cmd и выполнять их!

Если проблема в том, что вы создаете приложение WinForms (как упоминал Фадриан), то попробуйте сделать его приложением WPF (лично я предпочитаю WPF).поверх WinForms), если вы никогда ранее не кодировали приложение WPF, скачайте код, который я указывал в своем блоге здесь (да, тот, который вы посетили ранее), и измените его так, чтобы он загружал ваш Bukkit Server вместообычный сервер Minecraft, если он не работает, то проблема может быть в Bukkit Server, поэтому я рекомендую вам зайти на форум Bukkit и спросить там.

0 голосов
/ 08 мая 2011

Адам, я не знаю наверняка, ответ на ваш вопрос, но у меня была похожая проблема в прошлом, и я узнал, что приложение winform ведет себя немного по-разному, когда дело касается stdin и stdout с консоли.Я решил свою проблему после прочтения некоторых постов в Интернете с помощью API-вызова к AttachConsole (и FreeConsole для его освобождения).Может быть, это будет хорошей отправной точкой для изучения в качестве решения вашей проблемы.

[DllImport("kernel32.dll")]
static extern bool AttachConsole(int dwProcessId);
...