2011-05-08 29 views
2

所以我有一個進程(java命令行應用程序)隱藏着輸出和輸入被重定向。我可以很容易地閱讀輸出結果,並且可以工作,但是當我發送命令時,它不起作用。standardinput沒有被重定向C#

我認爲,我已確定,該輸入沒有被重定向,因爲:

(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:如果這是混亂的,只是把一個評論下來,我會很樂意澄清。

回答

感謝Tim, 替換以下行:

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

這不是becuse在WinForm,而是因爲Bukkit本身。不幸的是,我有同樣的問題,不知道如何解決它。 D:我注意到的一件事是,當我嘗試運行它時,它會劫持控制檯。 – 2011-05-09 04:19:22

+0

如果我想出任何東西,我會在這裏發佈。難道缺口會知道嗎? – 2011-05-09 11:09:31

+0

順便說一下,它不是一個好主意,只是說'java',因爲你可能會啓動一個64位電腦上的java 32位 – EaterOfCode 2012-08-12 07:04:50

回答

4

好吧,我整天都在搞這個,我找到了答案。當你用你的應用程序啓動bukkit時,你需要在程序參數中加入'-nojline'。這使得bukkit的輸入與標準輸入正常工作。

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

+0

你是我的朋友......真是太棒了!!!!!我實際上放棄了這一個。非常感謝!! – 2011-07-13 13:04:13

+0

嘿,沒有概率,這是在扼殺我的垃圾。整個答案幸運,並認爲我把它放在這裏,因爲我發現這個頁面像800次。 – Tim 2011-07-15 19:21:08

+0

謝謝<3現在我可以finnally完成我的gui tekkit:D – EaterOfCode 2012-08-12 07:02:45

0

亞當, 我不知道肯定的回答你的問題,但我過去也遇到過類似的問題,並瞭解到winform應用程序的確如此當涉及到控制檯的標準輸入和標準輸出時略有不同。我在使用API​​調用AttachConsole(和FreeConsole釋放它)後在線閱讀了一些帖子後解決了我的問題。也許這將是一個很好的起點,可以作爲解決問題的解決方案。

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

感謝您的想法,我會試試看,並報告回來。 – 2011-05-08 14:14:30

+0

如果您可以快速瞭解如何使用它。我已經將它附加到了進程中,但是當我使用console.writeline時,cmd提示符似乎是攔截但不是extcute。它只是寫在權利的cmd提示 – 2011-05-08 14:35:02

+0

那麼現在視覺工作室正在攔截它把它的輸出 – 2011-05-08 14:44:41

0

這是非常奇怪的,因爲如果輸入流不重定向(出於某種原因),那麼你會得到一個異常,你嘗試用Process.StandartInput財產做任何事情的那一刻,如果真的做重定向,那麼你將無法在cmd窗口中輸入命令並執行它們!如果問題是因爲你正在製作一個WinForms應用程序(就像Fadrian提到的那樣),那麼請嘗試使它成爲一個WPF應用程序(我個人更喜歡WPF而不是WinForms),如果你從未編寫WPF應用程序然後下載代碼I鏈接到我的博客文章here(是的,您之前訪問過的),並對其進行修改,以便加載您的Bukkit服務器而不是普通的Minecraft服務器,如果它不起作用,那麼問題可能與Bukkit服務器有關,點我建議你去Bukkit的論壇,並在那裏問。

+0

我從來沒有想過換成wpf ......但是沒有這樣做。也許這是我的電腦?我只是拿出你的代碼,開箱並編譯它,但沒有。我會在放學後再次更新 – 2011-05-12 11:19:31