我正处于最艰难的时期,试图让它发挥作用,希望你们中的一个人以前做过。
我有一个 C# 控制台应用程序正在运行一个继承其控制台的子进程。我希望将外部应用程序捕获的 ctrl-c 传递给内部应用程序,以便它有机会正常关闭。
我有一些非常简单的代码。我启动一个进程,然后使用 WaitForExit(10) 对其进行轮询。我还注册了一个 CancelKeyPress 处理程序,它在触发时将 bool 设置为 true。轮询循环也会检查这一点,当它为真时,它会调用 GenerateConsoleCtrlEvent()(我已经通过 pinvoke 对其进行了映射)。
我尝试了 GenerateConsoleCtrlEvent() 的多种参数组合。第一个参数为 0 或 1,第二个参数为 0 或子进程的 ID。似乎没有任何效果。有时我得到一个错误的回复,Marshal.GetLastWin32Error() 返回 0,有时我得到真实的回复。但没有一个会导致子应用程序收到 ctrl-c。
可以肯定的是,我编写了一个测试 C# 应用程序作为子应用程序,它打印出它正在发生的事情,并验证在它运行时手动键入 ctrl-c 确实会导致它退出。
我已经为此苦苦思索了几个小时。谁能给我一些指示,告诉我该去哪里?
最佳答案
不太确定这是一个好方法。这仅在使用 CreateProcess()
的 CREATE_NEW_PROCESS_GROUP 标志创建子进程时有效。然而,System.Diagnostics.Process 类不支持这一点。
考虑使用 Main() 方法的返回值。 Windows SDK 中已经为 Ctrl+C 中止定义了一个唯一值,STATUS_CONTROL_C_EXIT 或 0xC000013A。父进程可以从 Process.ExitCode
属性中获取该返回代码。
关于c# - 使用控制台应用程序卡在 C# 中的 GenerateConsoleCtrlEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/297615/