使用CREATE_NEW_PROCESS_GROUP

时间:2016-10-25 06:24:26

标签: java c++ windows process console

我在树中有3个进程:A - > B - > C. A是我不拥有的主机应用程序,CreateProcessdwCreationFlags = CREATE_NEW_PROCESS_GROUP来创建进程B.B是我的服务,C是我想要使用{生成的Java子进程{ {1}}并且能够发送Ctrl + C以触发关闭挂钩。

根据MSDN上的进程创建标记页面,CreateProcess标志禁用所有子进程的Ctrl + C:

  

新流程是新流程组的根流程。进程组包括作为此根进程后代的所有进程。新进程组的进程标识符与进程标识符相同,进程标识符在lpProcessInformation参数中返回。 GenerateConsoleCtrlEvent函数使用进程组来向一组控制台进程发送CTRL + BREAK信号。如果指定了此标志,则将禁用新进程组内所有进程的CTRL + C信号。

我需要一种方法来绕过这种行为,这样我就可以发送Ctrl + C信号来处理C.Ctrl + Break可以发送但是还不够,因为这是一个Java进程而且Ctrl + Break不会触发关掉。我尝试使用CREATE_NEW_PROCESS_GROUP创建进程C,并假设这将允许新控制台接收所有信号,但Ctrl + C也被阻止。有没有人知道是否有某种方法可以覆盖或绕过CREATE_NEW_CONSOLE并取消此Ctrl + C阻止?

1 个答案:

答案 0 :(得分:1)

感谢Harry提出的建议!对我有用的是以下内容:

SetConsoleCtrlHandler(null, false);
SetConsoleCtrlHandler(MyActualHandler, true);

看起来进程组的工作原理是调用SetConsoleCtrlHandler(null, true),你只需要在添加一个真正的处理程序之前禁用默认处理程序。