如何发送CTRL+C终止由Process启动的DOS命令?

还不够格啊 2015-02-02 02:53:24
手动操作:
在DOS命令提示符下执行一个命令,该命令是交互式的,需要手动键入CTRL+C才能终止,而DOS窗口依然不被关闭。

现在要用C#程序自动完成,由Process类启动命令,但不知道如何发送CTRL+C给这个已经启动的命令来终止它。
...全文
917 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
winnowc 2015-02-02
  • 打赏
  • 举报
回复
一般情况,kill就可以了。不过kill比较暴力,如果目标命令行程序可以处理ctrl+c信号让自己优雅退出,那么发送信号比较好。发送ctrl+c的通用方法需要4个api:

[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);

[DllImport("kernel32.dll")]
static extern bool FreeConsole();

// 使用时
AttachConsole(processId); // 附加到目标进程的console
SetConsoleCtrlHandler(IntPtr.Zero, true); // 设置自己的ctrl+c处理,防止自己被终止
GenerateConsoleCtrlEvent(0, 0); // 发送ctrl+c(注意:这是向所有共享该console的进程发送)
FreeConsole(); // 脱离目标console
  • 打赏
  • 举报
回复
Process.Start(...) 返回的 Process 对象,可以直接调用它的kill 方法中断。
还不够格啊 2015-02-02
  • 打赏
  • 举报
回复
引用 6 楼 layershow 的回复:
那么你的目标程序对 CTRL+C 有特殊处理?
目标程序是第三方的,应该没有其他特殊处理,只是中断程序。
layershow 2015-02-02
  • 打赏
  • 举报
回复
引用 5 楼 bebeing 的回复:
[quote=引用 1 楼 layershow 的回复:] 或者你的问题是向命令窗口写入CTRL+C,那么这是标准输入的问题,重定向标准输入可以由代码写入
重定向标准输入如何向流中写入CTRL+C?[/quote] 呃,我忘记了 CTRL+C 实际上是一个信号,不是从流输入, 那么你的目标程序对 CTRL+C 有特殊处理? 我去看一下是否有好的解决办法,想的太草率了,sorry
还不够格啊 2015-02-02
  • 打赏
  • 举报
回复
引用 1 楼 layershow 的回复:
或者你的问题是向命令窗口写入CTRL+C,那么这是标准输入的问题,重定向标准输入可以由代码写入
重定向标准输入如何向流中写入CTRL+C?
zhouzangood 2015-02-02
  • 打赏
  • 举报
回复
於黾 2015-02-02
  • 打赏
  • 举报
回复
为什么非要在程序里终止它? 把dos窗口显示出来,用户想终止就直接ctrl+c或者关闭窗口呗 而如果是程序自动调用,你应该确保被调用的程序可以自动停止,而不是运行起来没完
S314324153 2015-02-02
  • 打赏
  • 举报
回复
在程序里加个热键?
layershow 2015-02-02
  • 打赏
  • 举报
回复
Process 启动的那个可以直接调用 Kill 方法 或者你的问题是向命令窗口写入CTRL+C,那么这是标准输入的问题,重定向标准输入可以由代码写入 或者你可以模拟键盘的输入,那就不是几行代码的问题了

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧