Я пытаюсь создать приложение C, которое закрывает другое консольное приложение, посылая ему Control + C, но мой код не всегда работает. Программа, которую я пытаюсь закрыть с помощью Control + C, является процессом игрового сервера. Единственный способ закрыть его - нажать Control + C. Я хочу избежать использования TerminateProcess, потому что программа выполняет некоторую форму кода очистки при нажатии Control + C, и я боюсь, что TerminateProcess повредит файлы своей базы данных. Согласно всем моим исследованиям, GenerateConsoleCtrlEvent - это правильная функция для имитации Control + C, но она не работает.
Вот мой код:
FreeConsole();
if(AttachConsole(dwProcessID))
{
SetConsoleCtrlHandler(NULL, TRUE);
if (!GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0))
return;
FreeConsole();
if (WaitForSingleObject(hProcess, 30000) == WAIT_TIMEOUT)
{
Log("The process did not terminate on its own.");
}
}
// output: The process did not terminate on its own.
Выше код работает только частично ... Я знаю это, потому что это заставляет консольное приложение выплевывать информацию об отключении драйверов, но не выполняет полный код очистки и завершения работы. Почему мой код не работает? Кроме того, FreeConsole вызывает исчезновение моей собственной консоли, хотя она все еще работает в фоновом режиме. Есть ли функция, которую я могу вызвать, чтобы получить ее обратно?