Единственный общий способ остановить процесс - это использовать TerminateProcess . Но это так далеко от грации, как вы можете получить. Чтобы изящно закрыть процесс, нужно сказать процессу, что вы хотите, чтобы он остановился, и затем надеяться, что он подчинится. Хотя, в общем-то, сделать это невозможно.
Для программы с графическим интерфейсом обычным способом сообщить, что вы хотите, чтобы она прекратила работать, является закрытие ее главного окна. Там нет формальной идеи "главного окна", хотя. Программа может иметь ноль или более окон, и нет никакого способа узнать извне, какое окно вы должны закрыть, чтобы программа перестала работать.
Вы можете использовать EnumWindows для циклического перебора всех окон и выбора тех, которые относятся к вашему процессу. (Это будут те, для которых GetWindowThreadProcessId дает тот же идентификатор процесса, который дал вам CreateProcess.)
Закрытие окна может быть недостаточно. Программа может отображать диалоговое окно (запрос подтверждения или запрос сохранения изменений и т. Д.). Вам нужно заранее знать, как закрыть это диалоговое окно.
Программы без графического интерфейса могут иметь похожие проблемы. Этого может быть достаточно для имитации нажатия клавиш Ctrl + C. Впрочем, он может по-разному отлавливать и обрабатывать нажатие клавиш. Он может иметь систему меню, которая ожидает, что вы наберете «Q» для выхода из программы.
Короче говоря, вы не можете изящно закрыть программу, если заранее не знаете, как эта программа будет закрыта.