高级控制台函数的行为受控制台输入和输出模式的影响。 创建主机时,将为主机的输入缓冲区启用以下所有控制台输入模式:
- 行输入模式
- 处理的输入模式
- 回显输入模式
创建主机屏幕缓冲区时,以下两种控制台输出模式都已启用:
- 处理的输出模式
- 在 EOL 输出模式下包装
这三种输入模式以及经过处理的输出模式旨在协同工作。 最好启用或禁用所有这些模式作为组。 启用所有作后,应用程序据说处于“煮熟”模式,这意味着大部分处理都用于应用程序。 禁用所有作后,应用程序处于“原始”模式,这意味着输入未筛选,并且任何处理都留给应用程序。
应用程序可以使用 GetConsoleMode 函数来确定主机输入缓冲区或屏幕缓冲区的当前模式。 可以使用 SetConsoleMode 函数中的以下值启用或禁用这些模式中的任何一种。 请注意,设置一个屏幕缓冲区的输出模式不会影响其他屏幕缓冲区的输出模式。
如果 hConsoleHandle 参数是输入句柄,则模式可以是以下一个或多个值。 创建控制台时,默认情况下会启用 除ENABLE_WINDOW_INPUT 和 ENABLE_VIRTUAL_TERMINAL_INPUT 以外的所有输入模式。
| 价值 | 含义 |
|---|---|
| ENABLE_ECHO_INPUT 0x0004 | ReadFile 或 ReadConsole 函数读取的字符在键入控制台时写入活动屏幕缓冲区。 仅当同时启用 ENABLE_LINE_INPUT 模式时,才能使用此模式。 |
| ENABLE_INSERT_MODE 0x0020 | 启用后,控制台窗口中输入的文本将插入到当前光标位置,并且不会覆盖该位置后面的所有文本。 禁用后,将覆盖以下所有文本。 |
| ENABLE_LINE_INPUT 0x0002 | ReadFile 或 ReadConsole 函数仅在读取回车符时返回。 如果禁用此模式,则当一个或多个字符可用时,函数将返回。 |
| ENABLE_MOUSE_INPUT 0x0010 | 如果鼠标指针位于控制台窗口的边框内,并且窗口具有键盘焦点,则鼠标移动和按钮按下生成的鼠标事件将放置在输入缓冲区中。 即使启用此模式, ReadFile 或 ReadConsole 也会丢弃这些事件。 ReadConsoleInput 函数可用于从输入缓冲区读取MOUSE_EVENT输入记录。 |
| ENABLE_PROCESSED_INPUT 0x0001 | CTRL+C 由系统处理,不会放置在输入缓冲区中。 如果输入缓冲区由 ReadFile 或 ReadConsole 读取,则其他控制键由系统处理,并且不会在 ReadFile 或 ReadConsole 缓冲区中返回。 如果还启用了 ENABLE_LINE_INPUT 模式,则系统将处理后空间、回车符和换行符。 |
| ENABLE_QUICK_EDIT_MODE 0x0040 | 此标志允许用户使用鼠标选择和编辑文本。 若要启用此模式,请使用 ENABLE_QUICK_EDIT_MODE | ENABLE_EXTENDED_FLAGS。 若要禁用此模式,请使用不带此标志 的ENABLE_EXTENDED_FLAGS 。 |
| ENABLE_WINDOW_INPUT 0x0008 | 更改主机屏幕缓冲区大小的用户交互在控制台的输入缓冲区中报告。 有关这些事件的信息可以通过使用 ReadConsoleInput 函数的应用程序从输入缓冲区读取,但不能由那些使用 ReadFile 或 ReadConsole 的事件读取。 |
| ENABLE_VIRTUAL_TERMINAL_INPUT 0x0200 | 设置此标志会指示虚拟终端处理引擎将控制台窗口收到的用户输入转换为 控制台虚拟终端序列 ,该序列可由支持应用程序通过 ReadFile 或 ReadConsole 函数检索。 此标志的典型用法与输出句柄上的ENABLE_VIRTUAL_TERMINAL_PROCESSING结合使用,以连接到通过虚拟终端序列进行独占通信的应用程序。 |
如果 hConsoleHandle 参数是屏幕缓冲区句柄,则模式可以是以下一个或多个值。 创建屏幕缓冲区时,默认启用这两种输出模式。
| 价值 | 含义 |
|---|---|
| ENABLE_PROCESSED_OUTPUT 0x0001 | 由 WriteFile 或 WriteConsole 函数或 ReadFile 或 ReadConsole 函数回显的字符将分析 ASCII 控制序列,并执行正确的作。 将处理 Backspace、tab、bell、回车符和换行符。 在使用控制序列或设置 ENABLE_VIRTUAL_TERMINAL_PROCESSING 时,应启用它。 |
| ENABLE_WRAP_AT_EOL_OUTPUT 0x0002 | 当使用 WriteFile 或 WriteConsole 进行 写入或与 ReadFile 或 ReadConsole 回显时,光标将移动到下一行的开头(当它到达当前行的末尾时)。 这会导致当光标超出窗口中最后一行时,控制台窗口中显示的行会自动向上滚动。 它还会导致控制台屏幕缓冲区的内容向上滚动(..当光标超出控制台屏幕缓冲区中最后一行时,将 /放弃控制台屏幕缓冲区的上一行。 如果禁用此模式,则行中的最后一个字符将被任何后续字符覆盖。 |
| ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 | 使用 WriteFile 或 WriteConsole 进行写入时,将分析 VT100 和类似的控制字符序列,这些序列控制游标移动、颜色/字体模式,以及也可以通过现有控制台 API 执行的其他作。 有关详细信息,请参阅 控制台虚拟终端序列。 确保 使用此 标志时设置ENABLE_PROCESSED_OUTPUT。 |
| DISABLE_NEWLINE_AUTO_RETURN 0x0008 | 使用 WriteFile 或 WriteConsole 进行写入时,这会向行尾换行添加额外的状态,该状态可能会延迟游标移动和缓冲区滚动作。 通常 ,当ENABLE_WRAP_AT_EOL_OUTPUT 设置并且文本到达行的末尾时,光标将立即移动到下一行,缓冲区的内容将向上滚动一行。 与此标志集相反,游标不会移动到下一行,并且不执行滚动作。 写入的字符将打印在行的最后一个位置,光标将保留在此字符上方,就像 ENABLE_WRAP_AT_EOL_OUTPUT 关闭一样,但下一个可打印字符将像 ENABLE_WRAP_AT_EOL_OUTPUT打开一 样打印。 不会发生覆盖。 具体而言,光标会快速向下前进到以下行,如有必要,将执行滚动,打印字符,光标将向前推进一个位置。 此标志的典型用法与设置 ENABLE_VIRTUAL_TERMINAL_PROCESSING 结合使用,以更好地模拟终端模拟器,其中在屏幕上写入最终字符(.)。/in the bottom right corner) without triggering an immediate scroll is desired behavior. |
| ENABLE_LVB_GRID_WORLDWIDE 0x0010 | 用于写入字符属性(包括 WriteConsoleOutput 和 WriteConsoleOutputAttribute)的 API 允许使用字符属性中的标志来调整前景和文本背景的颜色。 此外,还用COMMON_LVB前缀指定了一系列 DBCS 标志。 从历史上看,这些标志仅在中文、日语和朝鲜语的 DBCS 代码页中运行。 除了前导字节和尾随字节标志外,其余标志描述线条绘制和反向视频(../swap 前台和背景色对于其他语言来说非常有用,以强调部分输出。 设置此控制台模式标志将允许在每种语言的每个代码页中使用这些属性。 默认情况下,它保持与已知应用程序的兼容性,这些应用程序以前利用控制台忽略非 CJK 计算机上的这些标志,以出于自己的目的或意外地将这些位存储在这些字段中。 请注意,如果使用ENABLE_VIRTUAL_TERMINAL_PROCESSING模式,如果附加的应用程序通过 控制台虚拟终端序列请求下划线或反转视频,则会设置 LVB 网格和反向视频标志,同时此标志仍处于关闭状态。 |