Прежде чем думать, что это дублирующий Вопрос, пожалуйста, прочитайте его: Да, этот вопрос обсуждается в SO на разных языках, по крайней мере, на Delphi, C # и C ++, но у них всех есть что-то общее: они говорят об обработке чистого выключенияне мешая этому.
Итак, начнем:
Сформировать приложение VCL. Я открываю новое окно консоли, используя AllocConsole
, но при закрытии этого окна крестиком в верхнем правом углу мое приложение закрывается.Что бы я хотел предотвратить , не справиться!
Какой-то код:
function Handler(dwCtrlType: DWORD): Boolean; cdecl;
begin
case dwCtrlType of
CTRL_CLOSE_EVENT, CTRL_C_EVENT, CTRL_BREAK_EVENT:
Exit(True);
else
Exit(false);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
AllocConsole;
SetConsoleCtrlHandler(@Handler, True);
end;
Я прочитал документацию WinAPI , но там ничего не говорится о предотвращении завершения работы приложения.
У меня естьпопытался добавить обработчики сообщений для WM_ENDSESSION
, WM_QUERYENDSESSION
, WM_CLOSE
и WM_QUIT
на мою MainForm, но ни один из них не вызывается.Я также пытался добавить событие FormCloseQuery
, но оно также не вызывается.
Я прочитал и опробовал найденное решение здесь , но SetConsoleCtrlHandler(nil, True);
не предоставляет заявку на прекращение
Итак, вкратце, как предотвратить завершение.