Мой consoleHandler не обрабатывает CTRL + C, даже если он правильно установлен - PullRequest
2 голосов
/ 28 сентября 2019

Смежный вопрос здесь

, но он не работает для меня, когда я нажимаю 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;
}

1 Ответ

2 голосов
/ 28 сентября 2019

С MSDN :

CTRL + BREAK всегда обрабатывается как сигнал, но типичное поведение CTRL + C может быть изменено тремя способами, которые препятствуют выполнению функций обработчикаcall:

  • Функция SetConsoleMode может отключить режим ENABLE_PROCESSED_INPUT для буфера ввода консоли, поэтому CTRL + C сообщается как ввод с клавиатуры, а не как сигнал.
  • Вызов SetConsoleCtrlHandler с помощьюАргументы NULL и TRUE заставляют вызывающий процесс игнорировать сигналы CTRL + C.Этот атрибут наследуется дочерними процессами, но он может быть включен или отключен любым процессом, не затрагивая существующие процессы.
  • Если консольный процесс отлаживается и сигналы CTRL + C не были отключены, система генерируетDBG_CONTROL_C исключение.Это исключение возникает только в интересах отладчика, и приложение никогда не должно использовать обработчик исключений для его устранения.Если отладчик обрабатывает исключение, приложение не заметит CTRL + C, за одним исключением: ожидаемое оповещение будет прервано.Если отладчик передает исключение на необработанное, CTRL + C передается консольному процессу и обрабатывается как сигнал, как обсуждалось ранее.

Возможно, третий пункт относится к вашей проблеме?Ваше приложение работает должным образом при работе в режиме выпуска?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...