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 = "cmd.exe";
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);

[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窗。。。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值