将字符串发送到已在运行的命令提示符

时间:2014-04-07 15:23:51

标签: c# command-prompt

我试图为" bukkit"制作GUI。

但我遇到了一些问题.. 但是很容易从控制台读取输出。但实际上是将字符串发回其中。有点困难。

以下是我如何读取输出并将其放入文本框中。

    private void button1_Click(object sender, EventArgs e)
    {
        backgroundWorker1.RunWorkerAsync();
        //ExecuteCommandSync("java -Xmx1024M -jar C:\\mc1\\craftbukkit.jar -o true");
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        server("java -Xmx1024M -jar F:\\Skrivebord\\MCTestServer\\craftbukkit.jar -o true");
    }

    public void server(string command)
    {
        try
        {
            var procStartInfo =
                new System.Diagnostics.ProcessStartInfo("cmd", "/c " + command);


            procStartInfo.RedirectStandardOutput = true;
            procStartInfo.UseShellExecute = false;
            procStartInfo.CreateNoWindow = true;
            var proc = new System.Diagnostics.Process();
            proc.OutputDataReceived += proc_OutputDataReceived;
            //proc.StandardInput += proc_InputData;
            proc.StartInfo = procStartInfo;
            //processname = proc.ProcessName.ToString();
            proc.Start();
            proc.BeginOutputReadLine();
            proc.WaitForExit();
        }
        catch (Exception objException)
        {
            Console.WriteLine("Error: " + objException.Message);
            // Log the exception
        }
    }

    void proc_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
    {
        this.Invoke((MethodInvoker)delegate
        {
            string textForConsole = "";
            if (!(textBox1.Text == ""))
            {
                StringBuilder builder = new StringBuilder();
                builder.Append(e.Data);
                builder.AppendLine();
                textForConsole = builder.ToString();
                builder.Append(textBox1.Text).AppendLine();
                textBox1.Text = builder.ToString();
            }
            else
            {
                textBox1.Text = e.Data;
            }
        });
    }

这完美无缺。但我不知道如何从我的C#应用​​程序实际发送字符串或进入控制台..

我试过这个(用Google搜索我的方式。但是没有用。):

[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
    public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
    [DllImport("user32.dll")]
    static extern bool SetForegroundWindow(IntPtr hWnd);
    [DllImport("User32.dll")]
    public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);

private void button2_Click(object sender, EventArgs e)
    {
        Process p = Process.GetProcessesByName("java").FirstOrDefault();
        if (p != null)
        {
            IntPtr h = p.MainWindowHandle;
            SetForegroundWindow(h);
            SendKeys.SendWait(textBox2.Text);
        }           
    }

任何人都知道怎么做?

1 个答案:

答案 0 :(得分:1)

您正在使用RedirectStandardOutput来阅读输出。下一个逻辑步骤是使用RedirectStandardInput 写入输入。如果您的应用程序是合适的pipe,那么它将起作用。

关于如何将密钥发送到程序,有一篇众所周知的文章:You can't simulate keyboard input with PostMessage这样也会给出正确答案:SendInput。谷歌的例子。

不,你不需要找到'这个过程。你刚开始吧,就在那里:' proc.Start() !!