Je suppose que je suis un peu en retard sur cette question, mais je vais écrire quelque chose quand même pour quelqu'un ayant le même problème.
C'est la même réponse que j'ai donné à cette question.
Mon problème est que j'aimerais que ma demande soit d'une application graphique, mais le processus exécuté doit être exécuté en arrière-plan sans aucune console interactive de la fenêtre ci-joint. Je pense que cette solution devrait également fonctionner lorsque le processus parent est un processus de console. Vous pouvez avoir à supprimer le "CREATE_NO_WINDOW" drapeau.
J'ai réussi à résoudre ce à l'aide de GenerateConsoleCtrlEvent(). La partie la plus délicate est juste que la documentation n'est pas vraiment clair sur exactement comment il peut être utilisé et les pièges.
Ma solution est basée sur ce qui est décrit ici. Mais cela n'a pas vraiment l'expliquer tous les détails et avec une erreur, voici donc les détails sur la façon d'obtenir ce travail.
Créer une nouvelle application d'aide "Helper.exe". Cette application va s'asseoir entre votre application (parent) et le processus de l'enfant que vous voulez être en mesure de fermer. Il permettra aussi de créer de réels processus enfant. Vous devez avoir cet "homme du milieu" ou GenerateConsoleCtrlEvent() échouera.
Utiliser une sorte de mécanisme IPC de communiquer de la part du parent à l'aide de processus que l'aide doit fermer le processus de l'enfant. Lorsque l'assistant d'obtenir cet événement qu'il appelle "GenerateConsoleCtrlEvent(CTRL_BREAK, 0)", qui se ferme de lui-même et le processus de l'enfant. J'ai utilisé un objet d'événement de ce moi-même qui le parent se termine quand il veut annuler le processus de l'enfant.
Pour créer votre Helper.exe créer avec CREATE_NO_WINDOW et CREATE_NEW_PROCESS_GROUP. Et lors de la création de l'enfant à créer avec pas de drapeaux (0) signifie qu'elle va tirer la console de son parent. Sinon, cela va l'amener à ignorer l'événement.
Il est très important que chaque étape se fait de cette manière. J'ai essayé toutes sortes de combinaisons, mais cette combinaison est le seul qui fonctionne. Vous ne pouvez pas envoyer un CTRL_C événement. Il sera de retour le succès, mais sera ignoré par le processus. CTRL_BREAK est le seul qui fonctionne. N'a pas vraiment d'importance, parce qu'ils seront tous deux appel ExitProcess() à la fin.
Vous aussi vous ne pouvez pas appeler GenerateConsoleCtrlEvent() avec un processus de groupd id de l'enfant id de processus directement permettant l'aide du processus de continuer à vivre. Cela ne fonctionne pas ainsi.
J'ai passé une journée entière à essayer d'obtenir ce travail. Cette solution fonctionne pour moi, mais si quelqu'un a quelque chose à ajouter s'il vous plaît. Je suis allé sur le net de trouver beaucoup de gens avec des problèmes similaires, mais pas de solution définitive au problème. Comment GenerateConsoleCtrlEvent() fonctionne est un peu bizarre donc si quelqu'un en sait plus de détails sur le s'il vous plaît partager.