高级控制台模式

高级控制台函数的行为会受控制台输入和输出模式的影响。 创建控制台时,将为控制台的输入缓冲区启用以下所有控制台输入模式:

  • 行输入模式
  • 已处理输入模式
  • 回显输入模式

创建控制台屏幕缓冲区时,会启用以下两种控制台输出模式:

  • 已处理输出模式
  • 在 EOL 处换行输出模式

所有这三种输入模式以及已处理输出模式设计为协同工作。 最好作为一个群组来启用或禁用所有这些模式。 全部启用后,应用程序处于“成熟”模式,这意味着针对应用程序进行了大部分处理。 全部禁用后,应用程序处于“原始”模式,这意味着未筛选输入,并且所有处理都留给应用程序。

应用程序可使用 GetConsoleMode 函数来确定控制台输入缓冲区或屏幕缓冲区的当前模式。 可以使用 SetConsoleMode 函数中的以下值来启用或禁用这些模式中的任何一种。 注意,设置一个屏幕缓冲区的输出模式不会影响其他屏幕缓冲区的输出模式。

如果 hConsoleHandle 参数是输入句柄,则模式可以是下列的一个或多个值。 创建控制台后,默认将启用所有输入模式(ENABLE_WINDOW_INPUT 和 ENABLE_VIRTUAL_TERMINAL_INPUT 除外)。

含义
ENABLE_ECHO_INPUT 0x0004 ReadFileReadConsole 函数读取的字符在键入到控制台时,将被写入到活动屏幕缓冲区。 只有同时启用了 ENABLE_LINE_INPUT 模式时,才能使用此模式
ENABLE_INSERT_MODE 0x0020 如果启用,在控制台窗口中输入的文本将插入到当前光标位置,并且不会覆盖该位置后面的所有文本。 如果禁用,则将覆盖后面的所有文本。
ENABLE_LINE_INPUT 0x0002 仅当读取回车符时,才返回 ReadFileReadConsole 函数。 如果禁用此模式,则将在有一个或多个字符可用时返回函数。
ENABLE_MOUSE_INPUT 0x0010 如果鼠标指针位于控制台窗口的边框内并且窗口具有键盘焦点,则通过移动鼠标和按下按钮生成的鼠标事件会放置在输入缓冲区中。 即使启用此模式,ReadFileReadConsole 也会丢弃这些事件ReadConsoleInput 函数可用于从输入缓冲区读取 MOUSE_EVENT 输入记录
ENABLE_PROCESSED_INPUT 0x0001 Ctrl+C 由系统处理,且不会放入输入缓冲区中。 如果 ReadFileReadConsole 正在读取输入缓冲区,则其他控制键将由系统处理,且不会返回到 ReadFile 或 ReadConsole 缓冲区中。 如果还启用了 ENABLE_LINE_INPUT 模式,则 Backspace、回车符和换行符将由系统处理
ENABLE_QUICK_EDIT_MODE 0x0040 用户可通过此标志使用鼠标选择和编辑文本。 要启用此模式,请使用 ENABLE_QUICK_EDIT_MODE | ENABLE_EXTENDED_FLAGS。 要禁用此模式,请使用不带此标志的 ENABLE_EXTENDED_FLAGS
ENABLE_WINDOW_INPUT 0x0008 更改控制台屏幕缓冲区大小的用户交互将记录到控制台的输入缓冲区中。 使用 ReadConsoleInput 函数的应用程序可从输入缓冲区中读取有关这些事件的信息,但使用 ReadFileReadConsole 的应用程序无法读取这些事件
ENABLE_VIRTUAL_TERMINAL_INPUT 0x0200 如果设置此标志,则会指导虚拟终端处理引擎将控制台窗口收到的用户输入转换为可由支持的应用程序通过 ReadFileReadConsole 函数检索的控制台虚拟终端序列

此标志通常与输出句柄上的 ENABLE_VIRTUAL_TERMINAL_PROCESSING 一起使用,以连接到只通过虚拟终端序列进行通信的应用程序。

如果 hConsoleHandle 参数是屏幕缓冲区句柄,则模式可以是下列的一个或多个值。 创建屏幕缓冲区后,默认情况下将启用这两种输出模式。

含义
ENABLE_PROCESSED_OUTPUT 0x0001 针对 ASCII 控制序列对由 WriteFileWriteConsole 函数写入的字符,或者由 ReadFileReadConsole 函数回显的字符进行分析,并执行正确的操作。 处理 Backspace、Tab、报警符、回车符和换行符。 应在使用控制序列或设置 ENABLE_VIRTUAL_TERMINAL_PROCESSING 时启用它
ENABLE_WRAP_AT_EOL_OUTPUT 0x0002 使用 WriteFileWriteConsole 写入时,或者使用 ReadFileReadConsole 回显时,当光标到达当前行的末尾时,它将移到下一行的开头。 这会导致控制台窗口中显示的行在光标前进到窗口的最后一行时自动向上滚动。 还会导致控制台屏幕缓冲区的内容在光标前进到控制台屏幕缓冲区的最后一行时向上滚动(../丢弃控制台屏幕缓冲区的顶行)。 如果禁用此模式,则将覆盖该行中的最后一个字符以及后面的任何字符。
ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 使用 WriteFileWriteConsole 写入时,将为 VT100 和类似控制字符序列分析字符,这些字符序列可控制光标移动、颜色/字体模式以及其他也可通过现有控制台 API 执行的操作。 有关详细信息,请参阅控制台虚拟终端序列
确保在使用此标志时设置 ENABLE_PROCESSED_OUTPUT
DISABLE_NEWLINE_AUTO_RETURN 0x0008 使用 WriteFileWriteConsole 写入时,这会将附加状态添加到行尾换行,从而可能导致延迟光标移动和缓冲区滚动操作

正常情况下,当设置 ENABLE_WRAP_AT_EOL_OUTPUT 并且文本到达行尾时,光标将立即移动到下一行,缓冲区的内容将向上滚动一行。 与此标志设置相反,光标不会移动到下一行,也不会执行滚动操作。 写入的字符将在该行的最后位置输出,并且光标将保持在该字符的上方,就好像 ENABLE_WRAP_AT_EOL_OUTPUT 已禁用一样,但将输出下一个可输出字符,就像 ENABLE_WRAP_AT_EOL_OUTPUT 已启用一样。 不会覆盖字符。 具体而言,光标会快速向下移动到下一行,必要时执行滚动,输出字符,然后光标向前移动一个位置。

此标志通常与 ENABLE_VIRTUAL_TERMINAL_PROCESSING 设置结合使用,以便更好地模拟终端模拟器,即在屏幕上(右下角位置)写入最后一个字符,但不触发立即滚动操作
ENABLE_LVB_GRID_WORLDWIDE 0x0010 用于写入字符属性(包括 WriteConsoleOutputWriteConsoleOutputAttribute)的 API 允许使用来自字符属性的标志调整文本的前景色和背景色。 此外,使用 COMMON_LVB 前缀指定了 DBCS 标志范围。 过去,这些标志仅在中文、日语和韩语的 DBCS 代码页中起作用。

除前导字节和尾随字节标志以外,其余描述线条绘制和反向显示(../前景色和背景色转换)的标志对于其他语言很有用,可用于强调输出的各个部分。

如果设置此控制台模式标志,则将允许在每种语言的每个代码页中使用这些属性。

默认情况下,此标志处于禁用状态,以保持与过去利用控制台的已知应用程序的兼容性,控制台会忽略非 CJK 计算机上的这些标志,以存储这些位字段,供自己使用或发生意外时使用。

请注意,使用 ENABLE_VIRTUAL_TERMINAL_PROCESSING 模式可能会导致设置 LVB 的网格和反向显示标志,而如果附加应用程序通过控制台虚拟终端序列请求下划线或反向显示,则此标志仍会处于禁用状态