各位:
最近使用C#和C混合变成,编写了一个windows应用程序。为了便于查看程序内部信息,打算在界面上点击一个按钮,触发调用cmd。在cmd窗口手动输入命令后,界面解析命令,进而调用不同的C函数,并将函数的printf结果输出到cmd窗口中。
现在遇到点问题,通过Process调用cmd之后,窗口内不能输入,请问是怎么回事。Process调用cmd命令如下:
private string RunCmd()
{
//例Process
Process p = new Process();
p.StartInfo.FileName = "cmd.exe"; //确定程序名
p.StartInfo.UseShellExecute = false; //Shell的使用
p.StartInfo.RedirectStandardInput = true; //重定向输入
p.StartInfo.RedirectStandardOutput = true; //重定向输出
p.StartInfo.CreateNoWindow = false; //设置显示窗口
p.Start();
p.StandardInput.WriteLine();
return p.StandardOutput.ReadToEnd();
}
请问C#怎么调用cmd.exe并实现输入命令功能,谢谢。
string str = Console.ReadLine(); System.Diagnostics.Process p = new System.Diagnostics.Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动 p.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息 p.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息 p.StartInfo.RedirectStandardError = true;//重定向标准错误输出 p.StartInfo.CreateNoWindow = true;//不显示程序窗口 p.Start();//启动程序 //向cmd窗口发送输入信息 p.StandardInput.WriteLine(str + "&exit"); p.StandardInput.AutoFlush = true; //p.StandardInput.WriteLine("exit"); //向标准输入写入要执行的命令。这里使用&是批处理命令的符号,表示前面一个命令不管是否执行成功都执行后面(exit)命令,如果不执行exit命令,后面调用ReadToEnd()方法会假死 //同类的符号还有&&和||前者表示必须前一个命令执行成功才会执行后面的命令,后者表示必须前一个命令执行失败才会执行后面的命令 //获取cmd窗口的输出信息 string output = p.StandardOutput.ReadToEnd(); //StreamReader reader = p.StandardOutput; //string line=reader.ReadLine(); //while (!reader.EndOfStream) //{ // str += line + " "; // line = reader.ReadLine(); //} p.WaitForExit();//等待程序执行完退出进程 p.Close(); Console.WriteLine(output);
大侠你好:我这个是windows应用程序,string str = Console.ReadLine();以及Console.WriteLine(output); 好像没有作用,请帮忙看看原因,谢谢。
@milestone_2010: 原理都一样啊,就是输入输出换了而已
@刘宏玺: 因为是windows应用程序,不是控制台应用程序,所以无法直接使用Console.ReadLine()。通过下面的方法可以解决,其实我还有一个问题想问,如果console能使用,干吗还要用process再起一个cmd.exe,这两个功能不是一样的吗?
[DllImport("kernel32.dll")]
public static extern bool AllocConsole();
[DllImport("kernel32.dll")]
public static extern bool FreeConsole();
private void RunCmd()
{
AllocConsole();
Console.WriteLine("Please Input the debug command!");
bool Flag = true;
while (Flag)
{
string strnew = Console.ReadLine();
if ("AB" == strnew)
{
FUN_AB();
}
else if ("CD" == strnew)
{
FUN_CD();
}
else if ("exit" == strnew)
{
MediaApi.ClassMediaApi.Md_NewDebugTestExit();
break;
}
else
{
FUN_ERROR();
}
}
FreeConsole();
}
@milestone_2010: 控制台应用程序又不是cmd.exe,当然要用process再起一个
输入重定向
您好:能解释的更清楚点吗,谢谢
这样试试
public void WriteConsole(string msg) { const int WM_CHAR = 0x102; if (consoleHandle == IntPtr.Zero) consoleHandle = FindWindow("ConsoleWindowClass", consoleTitle); foreach (var b in Encoding.ASCII.GetBytes(msg)) { SendMessage(consoleHandle.ToInt32(), WM_CHAR, b, 0); } SendMessage(consoleHandle.ToInt32(), WM_CHAR, 0x0d, 0);//回车ASCII码为0x0d }