Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

обработка закрытия консоли [D7, WinXP]


QAZ   (25.05.17 16:42

как отловить закрытие по кресту, альтФ4, контрлС ?
особенно интересует вариант закрытия консоли в приложении с ГУИ, при котором процесс просто убивается


NoUser ©   (25.05.17 23:29[1]

https://msdn.microsoft.com/en-us/library/windows/desktop/ms685049
https://msdn.microsoft.com/en-us/library/windows/desktop/ms686016


QAZ   (26.05.17 16:39[2]

ок перефразирую, как не дать закрыться консоли до того, как тебе этого захочется?


NoUser ©   (26.05.17 20:45[3]

контрлС -> HandlerRoutine -> Exit(True)
а
по кресту -> должно захотеться  секунд за 5 внутри HandlerRoutine.

Иначе ни винда ни пользователь тебя не поймут.


QAZ   (26.05.17 21:21[4]

вот именно 5 сек меня и не устраивает


DVM ©   (27.05.17 08:37[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 секундах речь, но у меня она ждет сколько надо. Правда и окно консоли я сам создаю обычно.


QAZ   (27.05.17 14:52[6]

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


DVM ©   (28.05.17 22:10[7]


> QAZ   (27.05.17 14:52) [6]
> DVM ты прикалываешься или скопипастил не глядя?

Ты прав, я скопипастил не глядя из своего проекта. Ничего у меня не закрывается само.

Ты не заметил, что я написал:

> Правда и окно консоли я сам создаю обычно.

Такая консоль ведет себя управляемо.


QAZ   (30.05.17 16:28[8]


> Ты не заметил

заметил, я тоже сам создаю...

> Такая консоль ведет себя управляемо

о боже, только не говори что ты сидишь на ХР до сих пор, только там такое возможно


QAZ   (30.05.17 16:30[9]

или в сервисе


DVM ©   (30.05.17 23:01[10]


> заметил, я тоже сам создаю...

Ну и в чем проблема тогда? Погаси крест, останется ctrl + c . Ты прям не как программист.


QAZ   (31.05.17 10:55[11]

крест это баян
а что делать с альт+ф4, а с пунктом "закрыть" в списке переходов в таскбаре с 7ки+ ?
ctrl + c и брейк вообще не напрягают, они то как раз блокируемы


Leonid Troyanovsky ©   (01.06.17 11:25[12]


> 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.


QAZ   (01.06.17 14:32[13]


> Leonid Troyanovsky ©   (01.06.17 11:25) [12]

ого, вот это извращение :)
в принципе неплохо, но не в главной форме же

а как бы сделать для этого отдельное окно, со своим независимым потоком, чтоб оно таки отображалось на таскбаре и было полностью живым даже если сама прога стоит на брекпоинте в отладке или закрашилось с выдачей сообщения?
собственно консоль именно для этого и нужна


Eraser ©   (01.06.17 15:48[14]


> QAZ   (01.06.17 14:32) [13]


> на брекпоинте в отладке

все потоки приостанавливаются.


QAZ   (01.06.17 18:47[15]


> Eraser ©   (01.06.17 15:48) [14]

достаточно чтоб оно сворачивалось и разворачивалось


Leonid Troyanovsky ©   (02.06.17 08:44[16]


> QAZ   (01.06.17 14:32) [13]

> в принципе неплохо, но не в главной форме же

А где написано, что главная?

> а как бы сделать для этого отдельное окно, со своим независимым
> потоком, чтоб оно таки отображалось на таскбаре и было полностью
> живым даже если сама прога стоит на брекпоинте в отладке
> или закрашилось с выдачей сообщения?

Нужно  делать отдельное приложение, бо закрашенный процесс
скорее мертв, чем жив хотя бы одним потоком.

> собственно консоль именно для этого и нужна

Консоль, сервис или гуи - здесь не самое главное.

--
Regards, LVT.


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо