Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 19.03.2018
Сообщений: 23

При нажатии кнопки закрытия консольного приложения, скрывать его вместо закрытия

13.10.2020, 09:07. Показов 1991. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Необходимо сделать скрытие консоли при нажатии кнопки закрытия.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.10.2020, 09:07
Ответы с готовыми решениями:

При нажатии кнопки закрытия окна, оно должно сворачиваться, а при нажатии на сворачивание - закрываться
привет всем)) задача такая: при нажатии кнопки закрытия окна, оно должно сворачиваться, а при нажатии на сворачивание - закрываться)) с...

Событие закрытия консольного приложения
Какой есть способ (желательно не слишком огромный) определять, когда закрывается приложение (консольное или нет) ЛЮБЫМ способом, будь то...

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

7
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,927
13.10.2020, 10:21
В общем случае так сделать нельзя. Окно эмулятора терминала принадлежит не вашей программе, а собственно эмулятору терминала.
Более того, как вы собираетесь отслеживать окно эмулятора терминала если приложение запускается без него? Скажем, в составе скрипта или с перенаправленным вводом-выводом.
Если вы хотите именно управления окнами, так создавайте оконное приложение.

Добавлено через 1 минуту
Ах да, чуть не забыл.
В каких-то частных случаях такое сделать наверняка можно, но все равно получится криво и костыльно. Просто потому что консольные приложения не предназначены отслеживать конкретное устройство вывода.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.10.2020, 10:50
Цитата Сообщение от Pime Посмотреть сообщение
Необходимо сделать скрытие консоли при нажатии кнопки закрытия.
Единственное, что ты можешь сделать, это запретить закрывать твою программу по Ctrl+C, при помощи SetConsoleCtrlHandler
https://docs.microsoft.com/en-... r-function
Закрытие консоли ты можешь отследить, но не можешь запретить.
0
Злостный нарушитель
 Аватар для Verevkin
10359 / 5774 / 1275
Регистрация: 12.03.2015
Сообщений: 26,687
13.10.2020, 12:40
У меня вопрос: а НАХРЕНА ЭТО тебе понадобилось?!
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
13.10.2020, 13:01
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
это запретить закрывать твою программу по Ctrl+C
я может что-то путаю, но вроде бы в новых виндовсах (7 и новее)
нельзя отменить закрытие консоли.

не важно, обработал ты сигнал Ctrl+C или нет.
в любом случае система даёт тебе порядка 7 секунд,
по истечению которых процесс будет уничтожен.

фрагмент из боевого кода (закрытие консоли по нажатию на крестик, ктрл+с, и тп)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
        ::BOOL WINAPI routine(const ::DWORD dwCtrlType)
        {
            auto& glob = ::tools::get_instance();
            assert(glob.clean);
 
            switch (dwCtrlType)
            {
            case CTRL_C_EVENT:
                //::printf("Ctrl+C pressed");
                glob.clean();
                ::tools::detail::setEvent(glob.event);
                ::Sleep(5'000);
                break;
            case CTRL_BREAK_EVENT:
                //::printf("Ctrl+Break pressed");
                glob.clean();
                ::tools::detail::setEvent(glob.event);
                ::Sleep(5'000);
                break;
            case CTRL_CLOSE_EVENT:
            {
                //::printf("Close pressed");
                glob.clean();
                ::tools::detail::setEvent(glob.event);
                ::Sleep(5'000);
                break;
            }
            case CTRL_LOGOFF_EVENT:
                //::printf("User logoff");
                glob.clean();
                ::tools::detail::setEvent(glob.event);
                ::Sleep(5'000);
                break;
            case CTRL_SHUTDOWN_EVENT:
                //::printf("System shutdown");
                glob.clean();
                ::tools::detail::setEvent(glob.event);
                ::Sleep(5'000);
                break;
            }
            // as we handle the event
            return TRUE;
        }
здесь обработчик 5 секунд удерживает обработчик сигнала,
что бы дать возможность основному приложению успеть завершить свою работу.
если за 5 секунд не уложится - будет принудительно уничтожен.

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

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


таким образом:
нельзя отменить завершение работы приложения по сигналу или по нажатию на крестик.
можно лишь выгадать себе 5-7 секунд времени на завершение работы.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.10.2020, 13:53
Цитата Сообщение от hoggy Посмотреть сообщение
здесь обработчик 5 секунд удерживает обработчик сигнала,
что бы дать возможность основному приложению успеть завершить свою работу.
если за 5 секунд не уложится - будет принудительно уничтожен.
А зачем тебе его удерживать? Возвращай сразу true и всё будет нормально, ничего не закроется.
Скорее всего, ты путаешь с зависанием обработчика, который в SetConsoleCtrlHandler. Если он завис, ничего не вернул, то через некоторое время процесс завершится принудительно.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
13.10.2020, 14:23
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Возвращай сразу true и всё будет нормально, ничего не закроется.
Скорее всего, ты путаешь с зависанием обработчика, который в SetConsoleCtrlHandler. Если он завис, ничего не вернул, то через некоторое время процесс завершится принудительно.
в моём случае задержка стоит везде для единообразия.

задержка не обязательна для Ctrl+C
и вот я сейчас проверил, ты прав: Ctrl+C можно отменить.
достаточно просто вернуть "мы обработали сигнал",
а самим тупо не закрывать приложение.

но задержка нужна для закрытия по крестику.
потому что если задержки нет,
то по нажатию на крестик приложение закроектся моментально.
а с задержкой у приложения есть 5 секунд что бы успеть завершиться корректно.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,927
13.10.2020, 17:53
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
запретить закрывать твою программу по Ctrl+C, при помощи SetConsoleCtrlHandler
Вы делаете это неправильно. Правильно - через сигналы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.10.2020, 17:53
Помогаю со студенческими работами здесь

Ждать ввода команды пользователем для закрытия консольного приложения
Здравствуйте. Погуглил инет но не нашел ответа. Мне именно что нужно ждать пока пользователь не введет команду на закрытия. На C++ я...

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

Автозапуск приложения после его закрытия
Всем привет. Хочу сделать автозапуск приложения после его закрытия или сворачивания через некоторое время, как можно реализовать? возможно...

Автоматический запуск приложения после его закрытия
Есть приложение, которое должно работать 24/7. Необходимо написать Bat-ник, который бы запускал это приложение автоматически после его ...

Автоматический запуск приложения после его закрытия со счётчиком перезапусков
Где то натыкался на такую возможность: автоматический запуск приложения (в виндовс) после его закрытия и сохранение количества...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru