【问题标题】:My consoleHandler does not handle CTRL+C even though properly set即使正确设置,我的 consoleHandler 也不处理 CTRL+C
【发布时间】:2020-01-28 16:32:48
【问题描述】:

相关问题是here

但这对我不起作用,当我按 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;
}

【问题讨论】:

    标签: c++ winapi window


    【解决方案1】:

    来自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 传递给 如前所述,控制台进程并被视为信号。

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

    【讨论】:

    • 我在发布版本中遇到了同样的问题,我不知道我需要调整哪些设置或我需要做什么?
    • CTRL + C 在命令行上工作,无论是否设置了处理程序。我只需要调试时的功能。
    • 谢谢您,您的解决方案将我带到 google: CTRL+C + 调试 + Visual Studio 并找到了解决方案! stackoverflow.com/questions/3949106/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多