当系统启动 控制台进程时,系统会创建一个新控制台,这是一个字符模式进程,其入口点是 主要 功能。 例如,当系统启动命令处理器 cmd.exe时,系统会创建新的控制台。 当命令处理器启动新的控制台进程时,用户可以指定系统是否为新进程创建新控制台,或者它是否继承命令处理器的控制台。
进程可以使用下列方法之一创建控制台:
- 图形用户界面(GUI)或控制台进程可以将 CreateProcess 函数与 CREATE_NEW_CONSOLE 配合使用,以使用新控制台创建控制台进程。 (默认情况下,控制台进程继承其父级的控制台,并且不能保证输入由其预期进程接收。
- 当前未附加到控制台的 GUI 或控制台进程可以使用 AllocConsole 函数创建新的控制台。 (创建 GUI 进程时不会附加到控制台。如果控制台进程是使用 CreateProcess 和 DETACHED_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 从其自己的会话分离(或者如果没有附加的会话)。