c# - 使用控制台应用程序卡在 C# 中的 GenerateConsoleCtrlEvent

标签 c# process console abort copy-paste

我正处于最艰难的时期,试图让它发挥作用,希望你们中的一个人以前做过。

我有一个 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/

相关文章:

c# - 从后台线程在 UI 线程上打开表单

用于检查进程是否正在运行并对结果采取行动的 Linux 脚本

javascript - 元素 $(this) 在 console.log 中输出不同的格式

c# - 在控制台窗口中写入希伯来字符,C#

c - 调用 printf() 的具有未定义参数编号的函数

c# - Entity Framework 代码生成策略 - Nullable varchar 与 Non-Nullable varchar

c# - Regex.Replace 仅替换字符串的开头

javascript - Node JS 和 C# 中的 AES 加密给出了不同的结果

python-3.x - 如何创建一个独立的进程让python在后台运行

c - 当有多个 fork 进程在运行时,我无法理解流程