Я обнаружил возможный «взлом», который может помешать закрытию приложения, в то же время аккуратно подчиняясь запросу на закрытие консоли.
В частности, это подходит, я думаю, для приложений с графическим интерфейсом, которые создали консоль как «дополнительную».
Из документации MSDN, в точке, где обработчик Ctrl называется , создается новый поток , чтобы вызвать обработчик. Мое решение, таким образом, состоит в том, чтобы уничтожить атакующий поток вторжения до того, как обработчик по умолчанию сможет вызвать ExitProcess. В подпрограмме обработчика (код на C ++):
// Detach Console:
FreeConsole();
// Prevent closing:
ExitThread(0);
return TRUE; // Not reached
РЕДАКТИРОВАТЬ: Кажется, это вызывает некоторые проблемы, как и следовало ожидать, я полагаю. Последующий вызов AllocConsole () зависает на неопределенное время, поэтому я подозреваю, что преждевременный выход из потока не сможет очистить должным образом.
РЕДАКТИРОВАТЬ 2:
Чтобы уточнить выше, я не обнаружил прямых проблем с продолжением запуска программы. Но имейте в виду, что мы принудительно прервали поток, созданный kernel32, поэтому любые ресурсы в kernel32 могут находиться в неопределенном состоянии. Это может вызвать непредвиденные проблемы при продолжении работы программы.
В основном, я думаю, эти проблемы будут связаны с консольным API. Как уже упоминалось, AllocConsole
не может работать с этого момента (зависает приложение), поэтому программа не может открыть новую консоль. Вполне возможно, что другие функции консоли также не будут работать. По сути, все, что вы делаете с этого момента и каким-либо образом (прямо или косвенно) вызывает ядро32, подвержено неопределенному поведению, но я подозреваю, что на практике не будет никаких проблем вне функций консоли.
Мой вывод заключается в том, что вам следует избегать этого метода, если это вообще возможно, но если преждевременное завершение хуже, то это можно рассматривать как экстренное решение, которое следует использовать с осторожностью и осторожностью.