Конференция "WinAPI" » обработка закрытия консоли [D7, WinXP]
 
  • QAZ (25.05.17 16:42) [0]
    как отловить закрытие по кресту, альтФ4, контрлС ?
    особенно интересует вариант закрытия консоли в приложении с ГУИ, при котором процесс просто убивается
  • NoUser © (25.05.17 23:29) [1]
  • 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.
 
Конференция "WinAPI" » обработка закрытия консоли [D7, WinXP]
Есть новые Нет новых   [118667   +45][b:0][p:0.001]