Gle*_*den 61
此页面上的所有答案都没有提到对ANSI 终端控制的新支持的一个重要方面,该支持已在构建 16257(及更高版本)中添加到Windows 10控制台主机。也就是说,它不是吗?e?n?a?b?l?e?d? 默认情况下。除非您使用的特定软件通过调用带有标志的SetConsoleMode API来启用ANSI 处理,否则ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0004)您将看不到颜色或获得该应用程序的 ANSI 处理。
ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
https://docs.microsoft.com/windows/console/setconsolemode使用WriteFile或WriteConsole 进行写入时,会为 VT100 和类似的控制字符序列解析字符,这些控制字符序列控制光标移动、颜色/字体模式以及也可以通过现有控制台 API 执行的其他操作。有关更多信息,请参阅控制台虚拟终端序列。
我猜原因本页工作所示的例子是,显然echo命令(或者也许是批处理的一部分CMD.EXE或conhost)通过调用刚才提到的API支持ANSI处理。但是许多其他工具或可执行文件会写入stdin或stdout可能不会执行此操作,在这种情况下,您将看不到这些进程的颜色。
幸运的是,全局默认值可以从opt-in更改为opt-out。注册表项HKEY_CURRENT_USER\Console\VirtualTerminalLevel设置了处理 ANSI 转义序列的全局默认行为。创建一个DWORD键(如有必要)并将其值设置为默认1全局启用(或0禁用)ANSI 处理。
[HKEY_CURRENT_USER\控制台] "VirtualTerminalLevel"=dword:00000001
请注意,此注册表设置控制default,这意味着它仅影响未通过调用SetConsoleMode(...). 因此,虽然注册表值可能有助于为控制台模式忽略的应用程序启用ANSI ,但它不会对任何控制台模式(出于某种原因)可能显式禁用ANSI 的应用程序产生影响。
rol*_*lve 22
从 Windows 10 TH2 (v1511) 开始,conhost.exe(并且,通过扩展,cmd.exe)支持 ANSI 转义序列,特别是颜色:
关于控制台虚拟终端序列的MSDN 页面解释了支持哪些序列以及如何启用它们:
您可以使用GetConsoleMode和SetConsoleMode标志来配置此行为。[...]
以下序列的行为基于 VT100 和衍生的终端仿真器技术,尤其是 xterm 终端仿真器。有关终端序列的更多信息,请访问http://vt100.net和http://invisible-island.net/xterm/ctlseqs/ctlseqs.html。
Jen*_*och 13
是否有任何用于解释 ANSI 着色的 Windows 控制台模拟器?
Windows 10 之前 - 控制台上没有对 ANSI 颜色的本机支持
对于低于 10 的 Windows 版本,Windows 命令控制台默认不支持输出着色。您可以安装Cmder、ConEmu、ANSICON或Mintty(在 GitBash 和 Cygwin 中默认使用)来为您的 Windows 命令控制台添加着色支持。
Windows 10 - 命令行颜色
从 Windows 10 开始,Windows 控制台默认支持 ANSI 转义序列和一些颜色。
演示
批处理命令
@echo off
cls
echo [101;93m STYLES [0m
echo ^<ESC^>[0m [0mReset[0m
echo ^<ESC^>[1m [1mBold[0m
echo ^<ESC^>[4m [4mUnderline[0m
echo ^<ESC^>[7m [7mInverse[0m
echo.
echo [101;93m NORMAL FOREGROUND COLORS [0m
echo ^<ESC^>[30m [30mBlack[0m (black)
echo ^<ESC^>[31m [31mRed[0m
echo ^<ESC^>[32m [32mGreen[0m
echo ^<ESC^>[33m [33mYellow[0m
echo ^<ESC^>[34m [34mBlue[0m
echo ^<ESC^>[35m [35mMagenta[0m
echo ^<ESC^>[36m [36mCyan[0m
echo ^<ESC^>[37m [37mWhite[0m
echo.
echo [101;93m NORMAL BACKGROUND COLORS [0m
echo ^<ESC^>[40m [40mBlack[0m
echo ^<ESC^>[41m [41mRed[0m
echo ^<ESC^>[42m [42mGreen[0m
echo ^<ESC^>[43m [43mYellow[0m
echo ^<ESC^>[44m [44mBlue[0m
echo ^<ESC^>[45m [45mMagenta[0m
echo ^<ESC^>[46m [46mCyan[0m
echo ^<ESC^>[47m [47mWhite[0m (white)
echo.
echo [101;93m STRONG FOREGROUND COLORS [0m
echo ^<ESC^>[90m [90mWhite[0m
echo ^<ESC^>[91m [91mRed[0m
echo ^<ESC^>[92m [92mGreen[0m
echo ^<ESC^>[93m [93mYellow[0m
echo ^<ESC^>[94m [94mBlue[0m
echo ^<ESC^>[95m [95mMagenta[0m
echo ^<ESC^>[96m [96mCyan[0m
echo ^<ESC^>[97m [97mWhite[0m
echo.
echo [101;93m STRONG BACKGROUND COLORS [0m
echo ^<ESC^>[100m [100mBlack[0m
echo ^<ESC^>[101m [101mRed[0m
echo ^<ESC^>[102m [102mGreen[0m
echo ^<ESC^>[103m [103mYellow[0m
echo ^<ESC^>[104m [104mBlue[0m
echo ^<ESC^>[105m [105mMagenta[0m
echo ^<ESC^>[106m [106mCyan[0m
echo ^<ESC^>[107m [107mWhite[0m
echo.
echo [101;93m COMBINATIONS [0m
echo ^<ESC^>[31m [31mred foreground color[0m
echo ^<ESC^>[7m [7minverse foreground ^<-^> background[0m
echo ^<ESC^>[7;31m [7;31minverse red foreground color[0m
echo ^<ESC^>[7m and nested ^<ESC^>[31m [7mbefore [31mnested[0m
echo ^<ESC^>[31m and nested ^<ESC^>[7m [31mbefore [7mnested[0m
Run Code Online (Sandbox Code Playgroud)
目前,Win10 中默认未启用 CMD 控制台颜色,因此,要启用它,请将以下内容添加到您的代码中:
#if defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD dwMode = 0;
GetConsoleMode(hOut, &dwMode);
dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
SetConsoleMode(hOut, dwMode);
// References:
//SetConsoleMode() and ENABLE_VIRTUAL_TERMINAL_PROCESSING?
//https://stackoverflow.com/questions/38772468/setconsolemode-and-enable-virtual-terminal-processing
// Windows console with ANSI colors handling
// https://superuser.com/questions/413073/windows-console-with-ansi-colors-handling
#endif
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
48797 次 |
| 最近记录: |