AllocConsole, SetConsoleCtrlHandler предотвращают завершение - PullRequest
0 голосов
/ 20 апреля 2019

Прежде чем думать, что это дублирующий Вопрос, пожалуйста, прочитайте его: Да, этот вопрос обсуждается в 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); не предоставляет заявку на прекращение

Итак, вкратце, как предотвратить завершение.

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