C#winform向cmd命令窗输⼊CTRL+C命令
最近在写⼀个很坑爹的⼯具,winform需要调⽤⼀个python写的⼯具。
我的⽅法是直接开个线程调⽤System.Diagnostics.Process启动⼀个cmd窗,然后往⾥⾯p.StandardInput.WriteLine(python ...)相关指令:
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = "";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = false;
p.Start();//启动程序
p.StandardInput.WriteLine("set PATH=%PATH%;C:/Python27/;C:/Python27/Scripts;");
//向cmd窗⼝发送输⼊信息
p.StandardInput.WriteLine("python main.py" + "&exit");
p.StandardInput.AutoFlush = true;
不过发现这个屌⼯具⽼是卡死,很多bug,似乎是异常没有处理好。懒得改他的代码,于是⽼⼤让我去监视这个线程,发现超时没有响应就直接⼲掉他。。。
好吧,本来想根据这个process.Id杀掉这个线程,发现杀不掉。怀疑是这时候启动了python的缘故。最后没办法,只能去CTRL+C去关闭它了。
但是怎么去输⼊CTRL+C呢?
⼏番折腾,发现这个:
[DllImport("kernel32.dll")]
static extern bool GenerateConsoleCtrlEvent(int dwCtrlEvent, int dwProcessGroupId);
writeline使用方法python
[DllImport("kernel32.dll")]
static extern bool SetConsoleCtrlHandler(IntPtr handlerRoutine, bool add);
[DllImport("kernel32.dll")]
static extern bool AttachConsole(int dwProcessId);
AttachConsole(temp.process.Id);
SetConsoleCtrlHandler(IntPtr.Zero, true);  //设置⾃⼰的ctrl+c处理,防⽌⾃⼰被终⽌
GenerateConsoleCtrlEvent(0, 0); // 发送ctrl+c(注意:这是向所有共享该console的进程发送)
Thread.Sleep(10);
SetConsoleCtrlHandler(IntPtr.Zero, false);  //重置此参数
这样可以成功发送CTRL+C到cmd窗。。。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。