-
как отловить закрытие по кресту, альтФ4, контрлС ? особенно интересует вариант закрытия консоли в приложении с ГУИ, при котором процесс просто убивается
-
-
ок перефразирую, как не дать закрыться консоли до того, как тебе этого захочется?
-
контрлС -> HandlerRoutine -> Exit(True) а по кресту -> должно захотеться секунд за 5 внутри HandlerRoutine.
Иначе ни винда ни пользователь тебя не поймут.
-
вот именно 5 сек меня и не устраивает
-
var
Stopping: boolean = false;
function CtrlHandler(Ctrl: Longint): LongBool; stdcall;
begin
if Ctrl in [CTRL_C_EVENT,
CTRL_BREAK_EVENT,
CTRL_CLOSE_EVENT,
CTRL_LOGOFF_EVENT,
CTRL_SHUTDOWN_EVENT] then
begin
Writeln(rsStoppingProgramm);
Stopping := True;
end;
Result := true;
end;
SetConsoleCtrlHandler(@CtrlHandler, True);
Пока сам не закроешься она не закроется. Не знаю о каких 5 секундах речь, но у меня она ждет сколько надо. Правда и окно консоли я сам создаю обычно.
-
DVM ты прикалываешься или скопипастил не глядя? по поводу 5 сек, замени свой Writeln на месажбокс и не нажимай кнопки на нем
-
> QAZ (27.05.17 14:52) [6] > DVM ты прикалываешься или скопипастил не глядя?
Ты прав, я скопипастил не глядя из своего проекта. Ничего у меня не закрывается само.
Ты не заметил, что я написал:
> Правда и окно консоли я сам создаю обычно.
Такая консоль ведет себя управляемо.
-
> Ты не заметил
заметил, я тоже сам создаю...
> Такая консоль ведет себя управляемо
о боже, только не говори что ты сидишь на ХР до сих пор, только там такое возможно
-
или в сервисе
-
> заметил, я тоже сам создаю...
Ну и в чем проблема тогда? Погаси крест, останется ctrl + c . Ты прям не как программист.
-
крест это баян а что делать с альт+ф4, а с пунктом "закрыть" в списке переходов в таскбаре с 7ки+ ? ctrl + c и брейк вообще не напрягают, они то как раз блокируемы
-
> QAZ (31.05.17 10:55) [11]
> а что делать с альт+ф4, а с пунктом "закрыть" в списке переходов
procedure TForm1.FormCreate(Sender: TObject); var hc : HWND; hm : HMENU; dwExStyle: DWORD; begin AllocConsole; hc := FindWindow('ConsoleWindowClass', PChar(Application.ExeName)); dwExStyle := GetWindowLong(hc, GWL_EXSTYLE); SetWindowLong(hc, GWL_EXSTYLE, dwExStyle or WS_EX_NOACTIVATE); hm := GetSystemMenu(hc, False); DeleteMenu(hm, SC_CLOSE, MF_BYCOMMAND); Windows.SetParent(hc, Handle); end;
-- Regards, LVT.
-
> Leonid Troyanovsky © (01.06.17 11:25) [12]
ого, вот это извращение :) в принципе неплохо, но не в главной форме же
а как бы сделать для этого отдельное окно, со своим независимым потоком, чтоб оно таки отображалось на таскбаре и было полностью живым даже если сама прога стоит на брекпоинте в отладке или закрашилось с выдачей сообщения? собственно консоль именно для этого и нужна
-
> QAZ (01.06.17 14:32) [13]
> на брекпоинте в отладке
все потоки приостанавливаются.
-
> Eraser © (01.06.17 15:48) [14]
достаточно чтоб оно сворачивалось и разворачивалось
-
> QAZ (01.06.17 14:32) [13]
> в принципе неплохо, но не в главной форме же
А где написано, что главная?
> а как бы сделать для этого отдельное окно, со своим независимым > потоком, чтоб оно таки отображалось на таскбаре и было полностью > живым даже если сама прога стоит на брекпоинте в отладке > или закрашилось с выдачей сообщения?
Нужно делать отдельное приложение, бо закрашенный процесс скорее мертв, чем жив хотя бы одним потоком.
> собственно консоль именно для этого и нужна
Консоль, сервис или гуи - здесь не самое главное.
-- Regards, LVT.
|