代码之家  ›  专栏  ›  技术社区  ›  Algoman

如何在windows上使用java中的vt100转义码

  •  1
  • Algoman  · 技术社区  · 6 年前

    vt100转义码是一种功能强大且流行的方法,用于在xterm或konsole等虚拟终端上格式化输出(颜色、定位、闪烁、下划线等)。看到了吗 https://en.wikipedia.org/wiki/ANSI_escape_code

    System.out.print 这些代码-例如

    // print "Hello, World!" in red
    System.out.print("\u001b[31mHello, World!");
    

    尽管Java程序应该是独立于平台的,但是当您从windows命令提示符运行这样的程序时,您将看到打印出来的代码,如下所示:

    ☐[31mHello, World!
    

    1 回复  |  直到 6 年前
        1
  •  2
  •   Algoman    5 年前

    https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences 把它翻译成Java。

    这会使用一些对kernel32.dll的调用,因此我必须合并Java本机访问(JNA)。要运行它,您需要下载 jna-*version*.jar jna-platform-*version*.jar https://github.com/java-native-access/jna#download 并将它们包含在你的项目中。

    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!");