我正在将“命令提示符”重新创建到Windows窗体中。该应用程序无法正常运行;而且我不知道为什么。
加载表单时,它可以运行cmd.exe(将cmd信息加载到“ TextBox_Receive”中,但是没有);并且在“ textBox_send”中写入任何命令(发送输入)之后;仅在按“ Enter”键2或3次后才会显示输入。
知道我在这里缺少什么吗?
public partial class Form1 : Form
{
// Global Variables:
private static StringBuilder cmdOutput = null;
Process p;
StreamWriter SW;
public Form1()
{
InitializeComponent();
textBox1.Text = Directory.GetCurrentDirectory();
// TextBox1 Gets the Current Directory
}
private void Form1_Load(object sender, EventArgs e)
{
checkBox1.Checked = true;
// This checkBox activates / deactivates writing commands into the "textBox_Send"
cmdOutput = new StringBuilder("");
p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.EnableRaisingEvents = true;
p.OutputDataReceived += new DataReceivedEventHandler(SortOutputHandler);
p.Start();
SW = p.StandardInput;
p.BeginOutputReadLine();
p.BeginErrorReadLine();
}
private static void SortOutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
// I dont actually understand this part of the code; as this is a "copy" of a snippet i found somewhere. Although it fixed one of my issues to redirect.
{
if (!String.IsNullOrEmpty(outLine.Data))
{
cmdOutput.Append(Environment.NewLine + outLine.Data);
}
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
// Send "Enter Key" - Send Command
if (e.KeyChar == 13)
{
SW.WriteLine(txtbox_send.Text);
txtbox_receive.Text = cmdOutput.ToString();
txtbox_send.Clear();
}
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
// Enable / Disable Sending Commands
if (checkBox1.Checked)
txtbox_send.Enabled = true;
else
txtbox_send.Enabled = false;
}
}
}
我认为您的问题是使用OutputDataReceived
。在documentation:
该事件在异步读取操作期间启用标准输出。要启动异步读取操作,您必须重定向流程的StandardOutput流,添加事件处理到OutputDataReceived事件,然后调用BeginOutputReadLine。此后,每次处理时都会发出OutputDataReceived事件信号将一行写到重定向的StandardOutput流,直到进程退出或调用CancelOutputRead。
请参阅该页面上的示例代码以获取更多详细信息。
但是-我不确定您是否需要走那条路线。您是否尝试过直接从StandardOutput流中直接读取?
您也可以尝试捕获错误数据。
为此:
行后]
p.OutputDataReceived += new DataReceivedEventHandler(SortOutputHandler);
输入此行
p.ErrorDataReceived += new DataReceivedEventHandler(SortOutputHandler);
cmd.exe
也可能有问题。