我的控制台处理程序不处理 CTRL+C,即使设置正确
My consoleHandler does not handle CTRL+C even though properly set
相关问题在这里
但它对我不起作用,当我按 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 传递给 控制台进程并被视为信号,如前所述。
也许第三点适用于你的问题?在发布模式下运行时,应用程序的行为是否符合预期?
相关文章:
- 有可能在信号处理程序中设置promise吗
- 将更高的优先级设置为 boost::asio 线程处理进程
- 我如何处理有关输入的字符串大小超过字符数组设置大小的错误?
- 网络插座 |无法设置on_close/打开处理程序
- 我的控制台处理程序不处理 CTRL+C,即使设置正确
- 设置一系列基/派生类来处理天气数据
- Xmllint未设置,而在路径中找不到XMLLINT;跳过XML预处理
- 设置终止和意外处理程序
- 如何在 Windows 异常处理程序中设置 MMX 寄存器以模拟不受支持的 3DNow! 说明
- 为什么我需要在多线程程序中使用pthread_sigmask来确保设置处理程序正在处理信号
- 尝试将构造函数设置为 0 - c++ 的未处理异常
- 如何在 CORBA 中获取和设置类字段?(处理 CORBA 对象的序列)
- 如何设置ZERO-MQ架构来处理不同速度的工人
- 如何设置错误处理语句的格式
- 设置碰撞检测,然后在 2D 游戏中处理碰撞
- 在信号处理程序中设置标志
- 是否可以在标准::设置比较器中处理相等性
- 在经过预处理的svg-xml文档上设置QGraphicsSvgItem的呈现器非常慢
- 如何设置PROCESS_set_QUOTA进行处理
- 处理程序是通过 XSetErrorHandler 全局还是线程本地设置的