GenerateConsoleLevent赢得';t关闭控制台应用程序

GenerateConsoleLevent赢得';t关闭控制台应用程序,c,windows,C,Windows,我试图创建一个C应用程序,通过向它发送Control+C来关闭另一个控制台应用程序,但我的代码似乎并不总是有效。我试图用Control+C关闭的程序是一个游戏服务器进程。。关闭它的唯一方法是按Control+C。我想避免使用TerminateProcess,因为当按下Control+C时,程序会执行某种形式的清理代码,我担心TerminateProcess会损坏其数据库文件。根据我所做的所有研究,GenerateConsoleLevent是模拟Control+C的正确函数,但它不起作用 这是我的

我试图创建一个C应用程序,通过向它发送Control+C来关闭另一个控制台应用程序,但我的代码似乎并不总是有效。我试图用Control+C关闭的程序是一个游戏服务器进程。。关闭它的唯一方法是按Control+C。我想避免使用TerminateProcess,因为当按下Control+C时,程序会执行某种形式的清理代码,我担心TerminateProcess会损坏其数据库文件。根据我所做的所有研究,GenerateConsoleLevent是模拟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正在导致我自己的控制台消失,尽管它仍然在后台运行。是否可以调用函数将其取回?

上述代码仅部分工作这是什么意思。vs,但它不工作。
generateConsoleControlEvent(CTRL\u C\u事件,0)
将事件发送到控制台中的所有进程组。个别进程可能会忽略它,特别是如果它们是通过
CREATE\u new\u PROCESS\u group
作为新组启动的,并且在启动时不手动启用Ctrl+C。但很明显,这个程序并没有忽略Ctrl+C,因为它似乎部分工作。可能它的控制台控制处理程序正在设置一个全局标志来表示正常关机。我假设正常的Ctrl+C通常可以工作,所以我打赌线程通过
ReadFile
ReadConsole
从控制台读取时被阻止。恼人的是,
generateConsoleCortLevent
没有像真正的Ctrl+C那样取消控制台读取。请检查Process Explorer中所有线程的堆栈跟踪,以确认控制台读取中至少有一个线程被阻止。因此,获取此。。。有时,当Control+C发送到应用程序时,它会按预期关闭,但其他时候它不会关闭。相反,应该关闭的控制台应用程序将保持打开状态。这就是为什么我说它部分起作用了。奇怪的是,在操作系统上更改时间似乎暂时解决了我的问题。您可能不得不放弃
generateConsoleControlEvent
,做一些不太干净的事情,例如通过
GetConsoleWindow()
获取控制台窗口句柄,并将Ctrl+C作为键盘输入直接发送到窗口。这允许控制台本身生成事件并取消挂起的读取。