콘솔 만들기

시스템은 콘솔 프로세스, 즉 진입점이 main 함수인 문자 모드 프로세스를 시작할 때 새 콘솔을 만듭니다. 예를 들어 시스템에서 cmd.exe 명령 프로세서를 시작할 때 새 콘솔을 만듭니다. 명령 프로세서에서 새 콘솔 프로세스를 시작하면 사용자가 시스템에서 새 프로세스에 대한 새 콘솔을 만들지 아니면 명령 프로세서의 콘솔을 상속할지 여부를 지정할 수 있습니다.

프로세스는 다음 방법 중 하나를 사용하여 콘솔을 만들 수 있습니다.

  • GUI(그래픽 사용자 인터페이스) 또는 콘솔 프로세스에서 CREATE_NEW_CONSOLE과 함께 CreateProcess 함수를 사용하여 새 콘솔에서 콘솔 프로세스를 만들 수 있습니다. (기본적으로 콘솔 프로세스는 부모의 콘솔을 상속하며, 의도한 프로세스에서 입력을 받는다고 보장하지는 않습니다.)
  • 현재 콘솔에 연결되지 않은 GUI 또는 콘솔 프로세스는 AllocConsole 함수를 사용하여 새 콘솔을 만들 수 있습니다. (GUI 프로세스는 생성될 때 콘솔에 연결되지 않습니다. 콘솔 프로세스는 DETACHED_PROCESS와 함께 CreateProcess를 사용하여 생성된 경우 콘솔에 연결되지 않습니다.)

일반적으로 사용자와 상호 작용해야 하는 오류가 발생하는 경우 프로세스는 AllocConsole을 사용하여 콘솔을 만듭니다. 예를 들어 GUI 프로세스는 일반 그래픽 인터페이스를 사용하지 못하도록 하는 오류가 발생할 때 콘솔을 만들 수 있고, 일반적으로 사용자와 상호 작용하지 않는 콘솔 프로세스는 오류를 표시하는 콘솔을 만들 수 있습니다.

또한 프로세스에서 CREATE_NEW_CONSOLE 플래그를 CreateProcess 호출에 지정하여 콘솔을 만들 수 있습니다. 이 방법은 부모 프로세스가 아니라 자식 프로세스에 액세스할 수 있는 새 콘솔을 만듭니다. 별도의 콘솔을 통해 부모 및 자식 프로세스 모두에서 충돌 없이 사용자와 상호 작용할 수 있습니다. 콘솔 프로세스를 만들 때 이 플래그를 지정하지 않으면 두 프로세스가 모두 동일한 콘솔에 연결되며, 올바른 프로세스에서 의도한 입력을 받는다고 보장하지는 않습니다. 애플리케이션은 입력 버퍼의 핸들을 상속하지 않는 자식 프로세스를 만들거나 자식 프로세스가 완료될 때까지 부모 프로세스에서 콘솔 입력을 읽지 못하도록 하는 동안 한 번에 하나의 자식 프로세스만 입력 버퍼 핸들을 상속하도록 설정하여 혼동을 방지할 수 있습니다.

새 콘솔을 만들면 새 콘솔 창과 화면 출력사용자 입력을 위한 별도의 I/O 버퍼가 생성됩니다. 새 콘솔과 관련된 프로세스는 GetStdHandle 함수를 사용하여 새 콘솔의 입력 및 화면 버퍼 핸들을 가져옵니다. 이러한 핸들을 사용하면 프로세스에서 콘솔에 액세스할 수 있습니다.

프로세스에서 CreateProcess를 사용하는 경우 해당 멤버가 자식 프로세스에 대해 만들어진 첫 번째 새 콘솔(있는 경우)의 특성을 제어하는 STARTUPINFO 구조체를 지정할 수 있습니다. CREATE_NEW_CONSOLE 플래그가 지정되면 CreateProcess 호출에 지정된 STARTUPINFO 구조체는 만들어진 콘솔에 영향을 줍니다. 자식 프로세스에서 이후에 AllocConsole을 사용하는 경우에도 만들어진 콘솔에 영향을 줍니다. 지정할 수 있는 콘솔 특성은 다음과 같습니다.

  • 새 콘솔 창의 크기(문자 셀)
  • 새 콘솔 창의 위치(화면 픽셀 좌표)
  • 새 콘솔 화면 버퍼의 크기(문자 셀)
  • 새 콘솔 화면 버퍼의 텍스트 및 배경색 특성
  • 새 콘솔 창의 제목 표시줄에 대한 이름 표시

STARTUPINFO 값이 지정되지 않으면 시스템에서 기본값을 사용합니다. 자식 프로세스는 GetStartupInfo 함수를 사용하여 STARTUPINFO 구조체의 값을 확인할 수 있습니다.

프로세스에서 화면에 있는 해당 콘솔 창의 위치를 변경할 수 없지만, 다음 콘솔 함수를 사용하여 STARTUPINFO 구조체에 지정된 다른 속성을 설정하거나 검색할 수 있습니다.

함수 설명
GetConsoleScreenBufferInfo 창 크기, 화면 버퍼 크기 및 색 특성을 검색합니다.
SetConsoleWindowInfo 콘솔 창의 크기를 변경합니다.
SetConsoleScreenBufferSize 콘솔 화면 버퍼의 크기를 변경합니다.
SetConsoleTextAttribute 색 특성을 설정합니다.
SetConsoleTitle 콘솔 창 제목을 설정합니다.
GetConsoleTitle 콘솔 창 제목을 검색합니다.

프로세스는 FreeConsole 함수를 사용하여 상속된 콘솔 또는 AllocConsole에서 만든 콘솔에서 자체 분리할 수 있습니다.

프로세스는 FreeConsole을 사용하여 자체 세션에서 분리한 후(또는 연결된 세션이 없는 경우) AttachConsole 함수를 사용하여 다른 기존 콘솔 세션에 자체 연결할 수 있습니다.