2013-02-20 2 views
2

C++로 작성된 GUI 기반 응용 프로그램에서 콘솔로 출력 할 수 있어야하므로 AttachConsole (ATTACH_PARENT_PROCESS) API와 this code을 사용하기로했습니다. 그 방법은 훌륭하지만 GUI 응용 프로그램을 명령 프롬프트 창에서 시작하면 GUI 응용 프로그램이 잘 시작되지만 명령 프롬프트 창을 닫으면 GUI 응용 프로그램이 종료됩니다 (종료되지 않고 종료되었습니다.). 이 응용 프로그램 종료를 방지하는 방법?콘솔을 닫을 때 GUI 응용 프로그램의 AttachConsole

+0

대신 AllocConsole을 사용하지 않는 것이 좋습니다. 그것은 당신의 필요에 더 적합하게 보일 것입니다. GUI와 콘솔 앱은 일반적으로 잘 어울리지 않습니다. –

+0

GUI 응용 프로그램이 자체적으로 실행되는 경우 콘솔을 할당 할 필요가 없기 때문에'AllocConsole'을 호출하지 않습니다. 일반적으로 실행하는 것처럼. GUI 응용 프로그램 옆에 명령 프롬프트 창이 열립니다. – ahmd0

+0

@ Cheersandhth.-Alf : 미안 해요. 고양이에 익숙하지 않아요? 더 자세한 정보를 제공 할 수 있습니까? – ahmd0

답변

0

stdout 스트림에 텍스트를 게시하기 직전에 상위 콘솔에 연결 한 다음 분리하여이 문제를 해결할 수있었습니다. 이렇게하면 텍스트가 올 바르고 콘솔이 내 GUI 응용 프로그램과 별개의 상태로 유지됩니다.

Here's the MFC/C++ class 사용하고자하는 사람들을위한 완벽한 구현.

+0

원본 코드 등을 모두 입력하는 대신 5 글자를 모두 입력 할 수 있다고 생각합니다. 원래 주석으로 설명 했으므로 요청시 자세히 설명하고 완전한 예제 소스 코드, 빌드 예제로 설명했습니다 대답으로 인해 응답에서 나는 예제를 실행했다. –

+0

GUI 프로세스가 연결되어있는 동안 콘솔이 닫힐 위험이있다. –

+0

@ Cheersandhth.- Alf 나는 이것을 보러 돌아왔다. 콘솔이 닫히면,'cat' 프로세스를 사용하지만 다른 GUI 서브 시스템 프로세스는 그대로 둡니다. 'cat' 프로세스가 콘솔에 첨부 된 프로세스이기 때문입니다. 매우 깔끔합니다. 나는 당신이 단지 그것을 설명했다면, 당신의 대답이 좋았을 것이라고 생각합니다. 그러나, 나는 ahmd0가 항상 출력을 파이프하기를 원한다는 것을 매우 의심합니다. 더 많은 일은 콘솔을 잠급니다. 다시 한번 나는 ahmd0가 원하지 않는다고 확신한다. FWIW, 내보기에서 ahmd0는 기존 콘솔에 GUI 하위 시스템 응용 프로그램을 연결해서는 안됩니다. 그것은 고통으로 이어질 것입니다. –

0

누군가 콘솔 창을 닫으면 응용 프로그램이 닫히지 않도록 할 수 있습니다.

이러한 이벤트를 가로 채는 HandlerRoutine을 설정하려면 SetConsoleCtrlHandler을 호출해야합니다.

콘솔 창을 닫고 앱을 계속 실행하려면 HandlerRoutine에서 FreeConsole으로 전화를 걸 수 있습니다. 그래도 작동하지 않으면 콘솔 창을 삭제하지 못하도록 메시지를 처리하고 핸들러에서 돌아온 후 앱이 FreeConsole에 전화하도록하는 플래그 또는 타이머를 설정하십시오.

사용자가 창에서 X를 치면 창을 닫을 수 없습니다. 내가 그것을 방지하기 위해 창 메뉴를 수정하는 것입니다. 자세한 내용은 http://blog.mischel.com/2008/07/14/going-too-far-back/을 참조하십시오.

+0

고마워요. 나는 그것을 시도했다. 불행히도 내가 처리기에서'FreeConsole'을 호출하면 내 GUI 응용 프로그램은 어쨌든 종료됩니다. 그리고 닫기 버튼을 비활성화하는 것은 너무 어렵습니다. 내가 생각했던 것은 printf() 나 다른 텍스트 출력이 끝난 순간에만 GUI 프로세스에 콘솔을 연결 한 다음 바로 연결을 끊는 것이다. 이렇게하면 붙어 있지 않습니다. 내가 알아낼 수없는 것은 그것을 우아하게 분리하는 방법입니다. 어떤 아이디어? – ahmd0

+0

'FreeConsole'이 정상적으로 분리되지 않습니까? –

+0

이 내용은 Q에서 다룰 수 있습니다. Q :이 Q에 대한 설명에 링크되어 있습니다. –

관련 문제