Мне нужно было вывести на консоль из моего приложения на основе графического интерфейса, написанного на C++, поэтому я решил использовать API AttachConsole (ATTACH_PARENT_PROCESS) и this code. Этот метод отлично работает, за исключением того, что когда я запускаю свое графическое приложение из окна командной строки, приложение графического интерфейса запускается нормально, но когда я закрываю окно командной строки, мое приложение графического интерфейса прекращается (обратите внимание, не закрыто, но завершено.) Есть ли какие-либо способ предотвратить это завершение приложения?AttachConsole из приложения GUI, когда консоль закрыта
ответ
Я смог решить эту проблему, присоединившись к родительской консоли прямо перед отправкой текста в поток stdout
, а затем, отсоединившись от него. Таким образом, текст будет опубликован хорошо, а консоль останется отдельно от моего графического интерфейса.
Here's the MFC/C++ class с полной реализацией для тех, кто хочет его использовать.
считают, что вы можете сделать это со всеми пятью символами, введенными вместо всего этого исходного кода и т. Д., Как я объяснил вам вначале в комментарии, и дополнительно объяснил, когда вы спросили, и проиллюстрировал полный пример исходного кода, пример сборки и запустите пример ответа, который из-за ответов удалил. –
. Вы рискуете закрыть консоль, пока ваш GUI-процесс будет подключен к ней. –
@ Cheersandhth.-Alf Я вернулся, чтобы посмотреть на это. Когда консоль закрыта, она вынимает процесс 'cat', но оставляет другой процесс подсистемы GUI. Потому что процесс 'cat' - это тот, который прикреплен к консоли. Это довольно аккуратно. Я думаю, что если бы вы только объяснили это, ваш ответ был бы хорошо принят. Тем не менее, я очень сомневаюсь, что ahmd0 хочет всегда передавать вывод. Более того, это блокирует консоль. Что снова я уверен, что ahmd0 не хочет. FWIW, на мой взгляд, ahmd0 не должен пытаться подключить приложение подсистемы GUI к существующей консоли. Это приведет к боли. –
Вы можете запретить закрывать приложение, когда кто-то закрывает окно консоли.
Включает вызов SetConsoleCtrlHandler для установки HandlerRoutine, который перехватывает эти события.
Если вы хотите закрыть окно консоли, но оставьте свое приложение включенным, вы можете позвонить FreeConsole
в свой HandlerRoutine
. Если это не сработает, обработайте сообщение, чтобы предотвратить уничтожение окна консоли, и установите флаг или таймер, который заставит ваше приложение вызывать FreeConsole
после возвращения из обработчика.
Насколько я помню, вы не можете предотвратить закрытие окна, когда пользователь нажимает на X в окне. Что я сделал, чтобы предотвратить это, измените меню окна. См. http://blog.mischel.com/2008/07/14/going-too-far-back/ для некоторых деталей.
Спасибо. Я попробовал. К сожалению, когда я вызываю 'FreeConsole' из обработчика, мое графическое приложение все равно заканчивается. И отключение кнопки закрытия слишком экстремально для моей привязки. То, что я думал, - это подключить консоль к моему графическому интерфейсу только на тот момент, когда printf() или любой другой текст будет выполнен, а затем отсоедините его сразу после. Таким образом, он не будет оставаться прикрепленным. Я не могу понять, как изящно отделить его. Есть идеи? – ahmd0
Разве 'FreeConsole' не отделяется? –
Все это рассматривается в Q, с которым я связан в комментариях к этому Q. –
- 1. Finalizer не вызывается, когда консоль закрыта.
- 2. Открытая консоль внутри приложения gui
- 3. Консоль открывается при запуске приложения GUI C++
- 4. Преобразование GUI C++ приложения в консоль
- 5. Вывести на консоль из приложения Win32 GUI на Windows 10
- 6. Может ли веб-приложение работать, даже когда консоль закрыта?
- 7. AttachConsole Ошибка 5: Доступ запрещен
- 8. Как и когда я могу подключить консоль с помощью возвращаемого dwProcessId CreateProcess
- 9. Консоль «Hangs» при запуске GUI
- 10. AttachConsole и QProcess :: readAll()
- 11. AttachConsole не объявлен
- 12. Показать консоль Java в GUI
- 13. Как написать консоль в приложении GUI
- 14. Когда «Потребительская сторона» TextureView закрыта?
- 15. ERR_INTERNET_DISCONNECTED, когда Chrome консоль открыта
- 16. C++ AttachConsole включает ошибку
- 17. форм Windows приложение закрывается, когда пользователь закрывает консоль прилагается
- 18. Чисто закрытие приложения приложения GUI Gui программно
- 19. Консоль GUI Haskell на Windows
- 20. Qt5 открывает консоль с приложениями gui
- 21. Извлечь текст из приложения GUI
- 22. Действие, когда форма закрыта C#
- 23. Определить, когда форма закрыта C#
- 24. QML открывает окно GUI и консоль
- 25. lazyinitializationexception, когда сессия не закрыта
- 26. Освободить память, когда форма закрыта
- 27. Выхода QThread когда GUI приложения выходят
- 28. О функции API AttachConsole/FreeConsole
- 29. Закройте открытую консоль после закрытия PyQt4 GUI
- 30. Консоль приложения вопрос
Почему бы вам не использовать 'AllocConsole'. Это кажется более подходящим для ваших нужд. GUI и консольные приложения обычно не очень хорошо сочетаются. –
Я не называю 'AllocConsole', потому что мне не нужна консоль, если приложение GUI запускается сам по себе (например, вы обычно запускаете его.) С помощью этого API окно командной строки открывается рядом с моим графическим интерфейсом. – ahmd0
@ Cheersandhth.-Alf: Извините, я не знаком с 'cat'? Вы можете дать более подробную информацию? – ahmd0