创建控制台

当系统启动 控制台进程时,系统会创建一个新控制台,这是一个字符模式进程,其入口点是 主要 功能。 例如,当系统启动命令处理器 cmd.exe时,系统会创建新的控制台。 当命令处理器启动新的控制台进程时,用户可以指定系统是否为新进程创建新控制台,或者它是否继承命令处理器的控制台。

进程可以使用下列方法之一创建控制台:

  • 图形用户界面(GUI)或控制台进程可以将 CreateProcess 函数与 CREATE_NEW_CONSOLE 配合使用,以使用新控制台创建控制台进程。 (默认情况下,控制台进程继承其父级的控制台,并且不能保证输入由其预期进程接收。
  • 当前未附加到控制台的 GUI 或控制台进程可以使用 AllocConsole 函数创建新的控制台。 (创建 GUI 进程时不会附加到控制台。如果控制台进程是使用 CreateProcessDETACHED_PROCESS 创建的,则不会附加到控制台。

通常,当发生错误时,进程使用 AllocConsole 创建控制台,这需要与用户交互。 例如,当发生错误时,GUI 进程可以创建控制台,从而阻止其使用正常的图形界面,或者通常不与用户交互的控制台进程可以创建控制台来显示错误。

进程还可以通过在对 CreateProcess 的调用中指定CREATE_NEW_CONSOLE标志来创建控制台。 此方法创建一个新的控制台,该控制台可供子进程访问,但不能访问父进程。 单独的控制台使父进程和子进程能够与用户交互,而不会发生冲突。 如果在创建控制台进程时未指定此标志,则这两个进程都附加到同一控制台,并且不能保证正确的进程将接收适用于它的输入。 应用程序可以通过创建不继承输入缓冲区句柄的子进程,或者一次只启用一个子进程来继承输入缓冲区句柄,同时防止父进程读取控制台输入,直到子进程完成。

创建新控制台会导致新的控制台窗口,以及单独的 I/O 缓冲区,用于 输出到屏幕用户输入。 与新控制台关联的进程使用 GetStdHandle 函数获取新主机的输入和屏幕缓冲区的句柄。 这些句柄使进程能够访问控制台。

当进程使用 CreateProcess 时,它可以指定 STARTUPINFO 结构,其成员控制为子进程创建的第一个新控制台(如果有)的特征。 调用 CreateProcess 中指定的 STARTUPINFO 结构会影响在指定CREATE_NEW_CONSOLE标志时创建的控制台。 如果子进程随后使用 AllocConsole,它还会影响创建的控制台。 可以指定以下控制台特征:

  • 新控制台窗口的大小(以字符单元格为单位)
  • 新控制台窗口的位置,以屏幕像素坐标为单位
  • 新主机的屏幕缓冲区的大小(以字符单元格为单位)
  • 新主机屏幕缓冲区的文本和背景色属性
  • 新控制台窗口标题栏的显示名称

如果未指定 STARTUPINFO 值,系统将使用默认值。 子进程可以使用 GetStartupInfo 函数来确定其 STARTUPINFO 结构中的值。

进程无法更改其控制台窗口在屏幕上的位置,但以下控制台函数可用于设置或检索 STARTUPINFO 结构中指定的其他属性。

功能 DESCRIPTION
GetConsoleScreenBufferInfo 检索窗口大小、屏幕缓冲区大小和颜色属性。
SetConsoleWindowInfo 更改控制台窗口的大小。
SetConsoleScreenBufferSize 更改控制台屏幕缓冲区的大小。
SetConsoleTextAttribute 设置颜色属性。
SetConsoleTitle 设置控制台窗口标题。
GetConsoleTitle 检索控制台窗口标题。

进程可以使用 FreeConsole 函数从继承的控制台或 AllocConsole 创建的控制台中分离自身。

进程可以使用 AttachConsole 函数将自身附加到另一个现有控制台会话,然后使用 FreeConsole 从其自己的会话分离(或者如果没有附加的会话)。