0 / 0 / 0
Регистрация: 31.03.2015
Сообщений: 30
1

Запретить завершение приложения после закрытия консоли

30.07.2017, 17:54. Показов 2124. Ответов 10
Метки нет (Все метки)

Помогите. Нужно чтобы после закрытия консоли (на крестик) приложение не завершало свою работу. Консоль создана с помощю AllocConsole()
Подскажите как решить даную проблему?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.07.2017, 17:54
Ответы с готовыми решениями:

Запуск приложения из-под консоли в отдельном потоке с записью времени запуска и закрытия в консоль
Добрый вечер, недавно начал изучать системное программирование, нашёл не особо много литературы и...

Обработка закрытия консоли
В моём случае неприемлемо насильственное завершение приложения, поэтому мне необходимо обрабатывать...

Завершение процесса после закрытия формы
Пишу приложение-клиент, которое принимает файлы по протоколу UDP. Хотелось бы, чтобы при закрытии...

Завершение потоков, после закрытия формы
После закрытия формы в процессах продолжает висеть процесс. Я так понимаю вот этот поток не...

10
Эксперт WindowsАвтор FAQ
17841 / 7576 / 889
Регистрация: 25.12.2011
Сообщений: 11,316
Записей в блоге: 17
31.07.2017, 16:00 2
C++
1
DeleteMenu(GetSystemMenu(GetConsoleWindow(), false), SC_CLOSE, MF_BYCOMMAND);
0
0 / 0 / 0
Регистрация: 31.03.2015
Сообщений: 30
01.08.2017, 00:38  [ТС] 3
Цитата Сообщение от Dragokas Посмотреть сообщение
DeleteMenu(GetSystemMenu(GetConsoleWindow(), false), SC_CLOSE, MF_BYCOMMAND);
Не совсем то что я имел в виду, нужно как то перехватить закрытие окна консоли и не дать завершиться приложению, при этом консоль должна закрыться

Добавлено через 6 минут
А если перехватить сообщение WM_DESTROY сработает?
0
0 / 0 / 0
Регистрация: 31.03.2015
Сообщений: 30
07.08.2017, 17:10  [ТС] 4
Цитата Сообщение от Leon24 Посмотреть сообщение
А если перехватить сообщение WM_DESTROY сработает?
Не сработает, проверял
0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
08.08.2017, 06:26 5
Цитата Сообщение от Leon24 Посмотреть сообщение
А если перехватить сообщение WM_DESTROY сработает?
Цитата Сообщение от Leon24 Посмотреть сообщение
Не сработает, проверял
Насколько мне известно сообщения консольного окна обрабатываются в csrss.exe. Поэтому и не работает.
Цитата Сообщение от Leon24 Посмотреть сообщение
нужно как то перехватить закрытие окна консоли и не дать завершиться
Может сделать отдельную программу, которая запустит нашу скрытно и при этом перенаправит ввод-вывод в пайпы. Далее поставит свой обработчик завершение консоли (SetConsoleCtrlHandler). При завершении оповестит нашу программу и завершится (но наш процесс при этом останется).
0
Эксперт С++
3201 / 2466 / 423
Регистрация: 03.05.2011
Сообщений: 5,098
Записей в блоге: 20
08.08.2017, 09:53 6
Цитата Сообщение от Leon24 Посмотреть сообщение
Нужно чтобы после закрытия консоли (на крестик) приложение не завершало свою работу.
т.е. из приложения запускается консоль, выполняет какую-то работу, потом консоль закрыться, а приложение должно работает дальше?
а если консоль запускать в отдельном потоке? После получения от неё данных, поток спокойно закрывается, основной процесс остается работать.
0
Эксперт WindowsАвтор FAQ
17841 / 7576 / 889
Регистрация: 25.12.2011
Сообщений: 11,316
Записей в блоге: 17
08.08.2017, 15:40 7
А можно подключиться к консоли в качестве отладчика, как это делает, например, WinDBG, не позволяя закрыть отлаживаемое приложение? А затем отменить выполнение ассемблерных инструкций, ответственных за завершение процесса, дав возможность консоли продолжить свою работу.
0
0 / 0 / 0
Регистрация: 31.03.2015
Сообщений: 30
09.08.2017, 21:30  [ТС] 8
Цитата Сообщение от _lunar_ Посмотреть сообщение
т.е. из приложения запускается консоль, выполняет какую-то работу, потом консоль закрыться, а приложение должно работает дальше?
Верно
Цитата Сообщение от _lunar_ Посмотреть сообщение
а если консоль запускать в отдельном потоке? После получения от неё данных, поток спокойно закрывается, основной процесс остается работать.
При закрытии консоли приложение закрываеться с каким то случайным кодом (тот же результат дало завершение приложения через диспетчер задач), возможно на каком то этапе сама операционка убивает процесс, так что думаю вряд ли поможет запуск в отдельном потоке
Цитата Сообщение от Dragokas Посмотреть сообщение
А можно подключиться к консоли в качестве отладчика, как это делает, например, WinDBG, не позволяя закрыть отлаживаемое приложение? А затем отменить выполнение ассемблерных инструкций, ответственных за завершение процесса, дав возможность консоли продолжить свою работу.
А по подробнее можно?

Добавлено через 16 секунд
Цитата Сообщение от _lunar_ Посмотреть сообщение
т.е. из приложения запускается консоль, выполняет какую-то работу, потом консоль закрыться, а приложение должно работает дальше?
Верно
Цитата Сообщение от _lunar_ Посмотреть сообщение
а если консоль запускать в отдельном потоке? После получения от неё данных, поток спокойно закрывается, основной процесс остается работать.
При закрытии консоли приложение закрываеться с каким то случайным кодом (тот же результат дало завершение приложения через диспетчер задач), возможно на каком то этапе сама операционка убивает процесс, так что думаю вряд ли поможет запуск в отдельном потоке
Цитата Сообщение от Dragokas Посмотреть сообщение
А можно подключиться к консоли в качестве отладчика, как это делает, например, WinDBG, не позволяя закрыть отлаживаемое приложение? А затем отменить выполнение ассемблерных инструкций, ответственных за завершение процесса, дав возможность консоли продолжить свою работу.
А по подробнее можно?
0
Эксперт WindowsАвтор FAQ
17841 / 7576 / 889
Регистрация: 25.12.2011
Сообщений: 11,316
Записей в блоге: 17
09.08.2017, 22:22 9
Цитата Сообщение от Leon24 Посмотреть сообщение
А по подробнее можно?
Да я сам точно не знаю, как оно работает и возможно ли это.
0
Эксперт С++
3201 / 2466 / 423
Регистрация: 03.05.2011
Сообщений: 5,098
Записей в блоге: 20
10.08.2017, 00:03 10
Цитата Сообщение от Leon24 Посмотреть сообщение
При закрытии консоли приложение закрываеться с каким то случайным кодом
Как закрывается консоль после создания через AllocConsole? FreeConsole используете при этом?
И всё таки стоит попробовать создать процесс с флагом DETACHED_PROCESS (или с флагом DEBUG_PROCESS) и попробовать "жестко" завершить работу потока через TerminateThread.
0
18 / 17 / 16
Регистрация: 04.07.2017
Сообщений: 36
10.08.2017, 14:07 11
Лучший ответ Сообщение было отмечено Leon24 как решение

Решение

Цитата Сообщение от Leon24 Посмотреть сообщение
Подскажите как решить даную проблему?
думаю, тут единственный адекватный вариант – отключить кнопку закрытия и сделать свой вариант закрытия, который будет просто освобождать консоль.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.08.2017, 14:07
Помогаю со студенческими работами здесь

После закрытия консоли выскакивает исключение if (!has_cctor) _cexit();
что с этим делать? буквально пол часа назад все нормально было код: #include "windows.h"...

После закрытия консоли выплывает необработанное исключение, delete в деструкторе
class X{ float *xo,*yo,*zo,*fo; public: X(); ~X(){}; friend void run(X x); friend...

IntelliTrace остается в процессах после закрытия программы. Правильное завершение программы?
Много (очень много) раз запускал программу, закрывал через крестик. Вдруг винда сообщает, что...

Удаление ярлыка после закрытия приложения
Здравствуйте. Помогите пожалуйста с правильным кодом? По нажатию кнопки открывается сторонний...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru