2013-02-20 2 views
2

Мне нужно было вывести на консоль из моего приложения на основе графического интерфейса, написанного на C++, поэтому я решил использовать API AttachConsole (ATTACH_PARENT_PROCESS) и this code. Этот метод отлично работает, за исключением того, что когда я запускаю свое графическое приложение из окна командной строки, приложение графического интерфейса запускается нормально, но когда я закрываю окно командной строки, мое приложение графического интерфейса прекращается (обратите внимание, не закрыто, но завершено.) Есть ли какие-либо способ предотвратить это завершение приложения?AttachConsole из приложения GUI, когда консоль закрыта

+0

Почему бы вам не использовать 'AllocConsole'. Это кажется более подходящим для ваших нужд. GUI и консольные приложения обычно не очень хорошо сочетаются. –

+0

Я не называю 'AllocConsole', потому что мне не нужна консоль, если приложение GUI запускается сам по себе (например, вы обычно запускаете его.) С помощью этого API окно командной строки открывается рядом с моим графическим интерфейсом. – ahmd0

+0

@ Cheersandhth.-Alf: Извините, я не знаком с 'cat'? Вы можете дать более подробную информацию? – ahmd0

ответ

0

Я смог решить эту проблему, присоединившись к родительской консоли прямо перед отправкой текста в поток stdout, а затем, отсоединившись от него. Таким образом, текст будет опубликован хорошо, а консоль останется отдельно от моего графического интерфейса.

Here's the MFC/C++ class с полной реализацией для тех, кто хочет его использовать.

+0

считают, что вы можете сделать это со всеми пятью символами, введенными вместо всего этого исходного кода и т. Д., Как я объяснил вам вначале в комментарии, и дополнительно объяснил, когда вы спросили, и проиллюстрировал полный пример исходного кода, пример сборки и запустите пример ответа, который из-за ответов удалил. –

+0

. Вы рискуете закрыть консоль, пока ваш GUI-процесс будет подключен к ней. –

+0

@ Cheersandhth.-Alf Я вернулся, чтобы посмотреть на это. Когда консоль закрыта, она вынимает процесс 'cat', но оставляет другой процесс подсистемы GUI. Потому что процесс 'cat' - это тот, который прикреплен к консоли. Это довольно аккуратно. Я думаю, что если бы вы только объяснили это, ваш ответ был бы хорошо принят. Тем не менее, я очень сомневаюсь, что ahmd0 хочет всегда передавать вывод. Более того, это блокирует консоль. Что снова я уверен, что ahmd0 не хочет. FWIW, на мой взгляд, ahmd0 не должен пытаться подключить приложение подсистемы GUI к существующей консоли. Это приведет к боли. –

0

Вы можете запретить закрывать приложение, когда кто-то закрывает окно консоли.

Включает вызов SetConsoleCtrlHandler для установки HandlerRoutine, который перехватывает эти события.

Если вы хотите закрыть окно консоли, но оставьте свое приложение включенным, вы можете позвонить FreeConsole в свой HandlerRoutine. Если это не сработает, обработайте сообщение, чтобы предотвратить уничтожение окна консоли, и установите флаг или таймер, который заставит ваше приложение вызывать FreeConsole после возвращения из обработчика.

Насколько я помню, вы не можете предотвратить закрытие окна, когда пользователь нажимает на X в окне. Что я сделал, чтобы предотвратить это, измените меню окна. См. http://blog.mischel.com/2008/07/14/going-too-far-back/ для некоторых деталей.

+0

Спасибо. Я попробовал. К сожалению, когда я вызываю 'FreeConsole' из обработчика, мое графическое приложение все равно заканчивается. И отключение кнопки закрытия слишком экстремально для моей привязки. То, что я думал, - это подключить консоль к моему графическому интерфейсу только на тот момент, когда printf() или любой другой текст будет выполнен, а затем отсоедините его сразу после. Таким образом, он не будет оставаться прикрепленным. Я не могу понять, как изящно отделить его. Есть идеи? – ahmd0

+0

Разве 'FreeConsole' не отделяется? –

+0

Все это рассматривается в Q, с которым я связан в комментариях к этому Q. –

Смежные вопросы