我创建了一个cmd进程,在其中我将输出显示到窗口。我希望能够像在命令提示符下按Control-c一样终止命令。
new ProcessStartInfo("cmd.exe");
我能想到的唯一选择是终止这个过程。这是按控制-c的作用吗?这个问题是一些用户设置将丢失。我能想到的两个是提示和当前目录。还有其他人吗?我可以记住这些并创建一个新进程并重置它们。或者还有另一种模拟中断的方法吗?
您可以通过调用开始方法开始一个过程。您也可以通过调用 Kill 方法来结束此过程。一切都很好。现在让我们通过运行cmd.exe并重定向输入和输出来启动进程。所以现在假设我们执行一个需要很长时间的命令。像我们在DOS窗口(命令提示符)中那样取消命令,而不是强制用户关闭并重新打开应用程序,在此过程中丢失历史记录,这样会很好。
如有必要,我可以提供更多详细信息。
答案 0 :(得分:1)
cmd.exe使用 1 的机制是GenerateConsoleCtrlEvent
,当Process.Start
调用创建新控制台时,它不可用,因为文档中存在此限制:
只有与调用进程共享同一控制台的组中的那些进程才会收到信号。换句话说,如果组中的进程创建了一个新控制台,那么该进程就不会收到信号,也不会收到它的后代。
您拥有的选项是不直接启动cmd.exe
,而是启动一个控制台程序,该程序又负责在其共享控制台中启动cmd.exe
,并保持与您的程序的通信链接打开以了解何时生成控制台控件事件。
实际上应该是控制台子系统检测到Ctrl + C并生成控制台事件,并且cmd.exe和任何子进程都会收到它。 cmd.exe有一个复杂的处理程序,它将取消正在运行的内置命令(如dir
)而不退出。当看到控制台控件事件时,子进程也可能具有干净地退出并保存状态的逻辑。