我的控制台处理程序不处理 CTRL+C,即使设置正确

My consoleHandler does not handle CTRL+C even though properly set

本文关键字:处理 设置 CTRL+C 控制台 程序 我的      更新时间:2023-10-16

相关问题在这里

但它对我不起作用,当我按 CTRL + C 调试器发出"未处理的事件"时,只有关闭控制台可以正常工作,但不适用于 CTRL + C,我的代码有什么问题?

这是代码:

#include <windows.h>
#include <iostream>
BOOL WINAPI consoleHandler(DWORD signal) noexcept
{
switch (signal)
{
case CTRL_C_EVENT:
ExitProcess(0); // not working
case CTRL_BREAK_EVENT:
break;
case CTRL_CLOSE_EVENT:
ExitProcess(0); // this works
case CTRL_LOGOFF_EVENT:
case CTRL_SHUTDOWN_EVENT:
break;
}       
return TRUE;
}
int main()
{
if (!SetConsoleCtrlHandler(consoleHandler, TRUE))
{
std::cout << "ERROR: Could not set control handler" << std::endl;
return EXIT_FAILURE;
}
DoSomeWork();
std::cin.get();
return 0;
}

来自 MSDN:

CTRL

+BREAK 始终被视为信号,但典型的 CTRL+C 行为 可以通过三种方式进行更改,以防止处理程序函数 被称为:

  • SetConsoleMode 函数可以禁用控制台输入缓冲区的ENABLE_PROCESSED_INPUT模式,因此 CTRL+C 报告为键盘 输入而不是作为信号。
  • 使用 NULL 和 TRUE 参数调用 SetConsoleCtrlHandler 会导致调用进程忽略 CTRL+C 信号。此属性是 由子进程继承,但可以由任何子进程启用或禁用 流程,而不影响现有流程。
  • 如果正在调试控制台进程,并且尚未禁用 CTRL+C 信号,则系统会生成DBG_CONTROL_C异常。这 引发异常只是为了调试器的利益,并且 应用程序永远不应使用异常处理程序来处理它。如果 调试器处理异常,应用程序不会注意到 CTRL+C,但有一个例外:可警报等待将终止。如果 调试器在未处理时传递异常,CTRL+C 传递给 控制台进程并被视为信号,如前所述。

也许第三点适用于你的问题?在发布模式下运行时,应用程序的行为是否符合预期?