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;
}

Ctrl+C不应该关闭进程,即使UseShellExecute:false也是如此

我用一组级联的进程解决了这个问题。进程"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