Ctrl+C不应该关闭进程,即使UseShellExecute:false也是如此
本文关键字:false UseShellExecute 即使 不应该 进程 Ctrl+C | 更新日期: 2023-09-27 18:22:44
我有一个控制台应用程序。我希望它开始一个过程,并在这个过程结束时结束。如果用户点击ctrl+c,我不希望应用程序关闭。如果我将UseShellExecute设置为false,那么这正是我所期望的——Ctrl C被忽略。
但是,当UseShellExecute:true时,ctrl+c事件似乎会传播到子进程并关闭子进程,即使父进程取消了它。
我不能使用ShellExecute:true,因为我想捕获consoleoutput和consoleror事件。
当UseShellExecute:false时,如何阻止ctrl+c事件到达子进程?
public static int Main(string[] args)
{
Console.CancelKeyPress += ConsoleOnCancelKeyPress;
Process process = new Process()
{
StartInfo = new ProcessStartInfo()
{
FileName = filename,
Arguments = args,
UseShellExecute = false,
RedirectStandardError = true,
RedirectStandardOutput = true,
RedirectStandardInput = true,
CreateNoWindow = false,
}
};
process.OutputDataReceived += process_OutputDataReceived;
process.ErrorDataReceived += process_ErrorDataReceived;
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();
return -1;
}
private static void ConsoleOnCancelKeyPress(object sender, ConsoleCancelEventArgs consoleCancelEventArgs)
{
consoleCancelEventArgs.Cancel = true;
}
我用一组级联的进程解决了这个问题。进程"A"使用UseShellExecute=true启动进程"B"。进程"B"使用UseShellExecute=false启动进程"C"。
当进程"A"接收到Ctrl+C时,它会在我想要的时间段内捕获它。然后它通过过程将其传递给"B"。关闭主窗口()。
进程"B"仍然可以读取进程"C"(我正试图托管和监视它)的控制台输出,因为UseShellExecute=false。从"A"发送的CloseMainWindow直接转到"B"answers"C",并关闭这两个进程。
我很幸运,我的逻辑可以在过程之间如此清晰地分割。除此之外,我认为Stephen Toub的这篇博客文章是Dave建议的键盘陷阱的一个很好的起点。我无法让它在我的x64进程中工作,尽管我没有排除用户错误。http://blogs.msdn.com/b/toub/archive/2006/05/03/589423.aspx
使用键盘挂钩将Ctrl-C困在控制台中这将覆盖操作。使用此代码启用该功能:
http://blogs.msdn.com/b/toub/archive/2006/05/03/589423.aspx