我不知道这是否适用于旧版本的 Windows(欢迎提供一些反馈 - 我已经在 Windows 10 上对其进行了测试),但我从https://docs.microsoft.com/en底部获取了代码-us/windows/console/console-virtual-terminal-sequences并将其翻译成 Java。
这使用了对 kernel32.dll 的一些调用,因此我必须合并 Java Native Access (JNA)。要运行它,您需要从
https://github.com/java-native-access/jna#downloadjna-*version*.jar
下载并将它们包含在您的项目中。jna-platform-*version*.jar
然后,添加这些导入:
import com.sun.jna.*;
import com.sun.jna.platform.win32.WinDef.*;
import com.sun.jna.platform.win32.WinNT.HANDLE;
在您的程序开始时,您可以通过运行以下代码来启用 vt100:
if(System.getProperty("os.name").startsWith("Windows"))
{
// Set output mode to handle virtual terminal sequences
Function GetStdHandleFunc = Function.getFunction("kernel32", "GetStdHandle");
DWORD STD_OUTPUT_HANDLE = new DWORD(-11);
HANDLE hOut = (HANDLE)GetStdHandleFunc.invoke(HANDLE.class, new Object[]{STD_OUTPUT_HANDLE});
DWORDByReference p_dwMode = new DWORDByReference(new DWORD(0));
Function GetConsoleModeFunc = Function.getFunction("kernel32", "GetConsoleMode");
GetConsoleModeFunc.invoke(BOOL.class, new Object[]{hOut, p_dwMode});
int ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4;
DWORD dwMode = p_dwMode.getValue();
dwMode.setValue(dwMode.intValue() | ENABLE_VIRTUAL_TERMINAL_PROCESSING);
Function SetConsoleModeFunc = Function.getFunction("kernel32", "SetConsoleMode");
SetConsoleModeFunc.invoke(BOOL.class, new Object[]{hOut, dwMode});
}
从那时起
System.out.print("\u001b[31mHello, World!");
将打印“你好,世界!” 正如预期的那样,红色。