Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Leon24
0 / 0 / 0
Регистрация: 31.03.2015
Сообщений: 26
Завершенные тесты: 2
1

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

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

Помогите. Нужно чтобы после закрытия консоли (на крестик) приложение не завершало свою работу. Консоль создана с помощю AllocConsole()
Подскажите как решить даную проблему?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2017, 17:54
Ответы с готовыми решениями:

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

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

Завершение приложения при нажатии на кнопку
В программе с помощью ComboBox выбирается COM порт, и выбор подтверждается...

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

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

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

Добавлено через 6 минут
А если перехватить сообщение WM_DESTROY сработает?
0
Leon24
0 / 0 / 0
Регистрация: 31.03.2015
Сообщений: 26
Завершенные тесты: 2
07.08.2017, 17:10  [ТС] 4
Цитата Сообщение от Leon24 Посмотреть сообщение
А если перехватить сообщение WM_DESTROY сработает?
Не сработает, проверял
0
jupman
230 / 133 / 19
Регистрация: 10.11.2015
Сообщений: 305
08.08.2017, 06:26 5
Цитата Сообщение от Leon24 Посмотреть сообщение
А если перехватить сообщение WM_DESTROY сработает?
Цитата Сообщение от Leon24 Посмотреть сообщение
Не сработает, проверял
Насколько мне известно сообщения консольного окна обрабатываются в csrss.exe. Поэтому и не работает.
Цитата Сообщение от Leon24 Посмотреть сообщение
нужно как то перехватить закрытие окна консоли и не дать завершиться
Может сделать отдельную программу, которая запустит нашу скрытно и при этом перенаправит ввод-вывод в пайпы. Далее поставит свой обработчик завершение консоли (SetConsoleCtrlHandler). При завершении оповестит нашу программу и завершится (но наш процесс при этом останется).
0
_lunar_
1452 / 1368 / 185
Регистрация: 03.05.2011
Сообщений: 3,184
Завершенные тесты: 1
08.08.2017, 09:53 6
Цитата Сообщение от Leon24 Посмотреть сообщение
Нужно чтобы после закрытия консоли (на крестик) приложение не завершало свою работу.
т.е. из приложения запускается консоль, выполняет какую-то работу, потом консоль закрыться, а приложение должно работает дальше?
а если консоль запускать в отдельном потоке? После получения от неё данных, поток спокойно закрывается, основной процесс остается работать.
0
Dragokas
Эксперт WindowsАвтор FAQ
17027 / 7085 / 856
Регистрация: 25.12.2011
Сообщений: 10,908
Записей в блоге: 16
08.08.2017, 15:40 7
А можно подключиться к консоли в качестве отладчика, как это делает, например, WinDBG, не позволяя закрыть отлаживаемое приложение? А затем отменить выполнение ассемблерных инструкций, ответственных за завершение процесса, дав возможность консоли продолжить свою работу.
0
Leon24
0 / 0 / 0
Регистрация: 31.03.2015
Сообщений: 26
Завершенные тесты: 2
09.08.2017, 21:30  [ТС] 8
Цитата Сообщение от _lunar_ Посмотреть сообщение
т.е. из приложения запускается консоль, выполняет какую-то работу, потом консоль закрыться, а приложение должно работает дальше?
Верно
Цитата Сообщение от _lunar_ Посмотреть сообщение
а если консоль запускать в отдельном потоке? После получения от неё данных, поток спокойно закрывается, основной процесс остается работать.
При закрытии консоли приложение закрываеться с каким то случайным кодом (тот же результат дало завершение приложения через диспетчер задач), возможно на каком то этапе сама операционка убивает процесс, так что думаю вряд ли поможет запуск в отдельном потоке
Цитата Сообщение от Dragokas Посмотреть сообщение
А можно подключиться к консоли в качестве отладчика, как это делает, например, WinDBG, не позволяя закрыть отлаживаемое приложение? А затем отменить выполнение ассемблерных инструкций, ответственных за завершение процесса, дав возможность консоли продолжить свою работу.
А по подробнее можно?

Добавлено через 16 секунд
Цитата Сообщение от _lunar_ Посмотреть сообщение
т.е. из приложения запускается консоль, выполняет какую-то работу, потом консоль закрыться, а приложение должно работает дальше?
Верно
Цитата Сообщение от _lunar_ Посмотреть сообщение
а если консоль запускать в отдельном потоке? После получения от неё данных, поток спокойно закрывается, основной процесс остается работать.
При закрытии консоли приложение закрываеться с каким то случайным кодом (тот же результат дало завершение приложения через диспетчер задач), возможно на каком то этапе сама операционка убивает процесс, так что думаю вряд ли поможет запуск в отдельном потоке
Цитата Сообщение от Dragokas Посмотреть сообщение
А можно подключиться к консоли в качестве отладчика, как это делает, например, WinDBG, не позволяя закрыть отлаживаемое приложение? А затем отменить выполнение ассемблерных инструкций, ответственных за завершение процесса, дав возможность консоли продолжить свою работу.
А по подробнее можно?
0
Dragokas
Эксперт WindowsАвтор FAQ
17027 / 7085 / 856
Регистрация: 25.12.2011
Сообщений: 10,908
Записей в блоге: 16
09.08.2017, 22:22 9
Цитата Сообщение от Leon24 Посмотреть сообщение
А по подробнее можно?
Да я сам точно не знаю, как оно работает и возможно ли это.
0
_lunar_
1452 / 1368 / 185
Регистрация: 03.05.2011
Сообщений: 3,184
Завершенные тесты: 1
10.08.2017, 00:03 10
Цитата Сообщение от Leon24 Посмотреть сообщение
При закрытии консоли приложение закрываеться с каким то случайным кодом
Как закрывается консоль после создания через AllocConsole? FreeConsole используете при этом?
И всё таки стоит попробовать создать процесс с флагом DETACHED_PROCESS (или с флагом DEBUG_PROCESS) и попробовать "жестко" завершить работу потока через TerminateThread.
0
Quaentor
14 / 14 / 16
Регистрация: 04.07.2017
Сообщений: 31
10.08.2017, 14:07 11
Лучший ответ Сообщение было отмечено Leon24 как решение

Решение

Цитата Сообщение от Leon24 Посмотреть сообщение
Подскажите как решить даную проблему?
думаю, тут единственный адекватный вариант – отключить кнопку закрытия и сделать свой вариант закрытия, который будет просто освобождать консоль.
1
10.08.2017, 14:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2017, 14:07

Программа на WinApi висит после закрытия в Диспетчере
После запуска приложения в VS приходится останавливать даже после закрытия....

Почему исчезает рисунок в консоли после прокрутки?
// рассчитываю функцию и заполняю массивы x и y ... //Рисование POINT op;...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru