有没有办法让窗口输出 ansi 转义序列

Is there a way to make windows output ansi escape sequences

本文关键字:输出 ansi 转义序列 窗口 有没有      更新时间:2023-10-16

有没有办法在内部控制台颜色更改后使Windows输出ANSI转义序列?我知道像 ansicon 这样的东西可以解释正在运行的程序输出的 ansi 转义序列,但我想知道是否有办法让 windows 通过 stdout 转发这些转义序列。例如


#include 
#include 
using namespace std;
HANDLE hCon;
enum Color { DARKBLUE = 1, DARKGREEN, DARKTEAL, DARKRED, DARKPINK, DARKYELLOW, GRAY, DARKGRAY, BLUE, GREEN, TEAL, RED, PINK, YELLOW, WHITE };
void SetColor(Color c){
        if(hCon == NULL)
                hCon = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(hCon, c);
}
int main()
{
    std::cout "x1b[31;1m  I should be red if printed on the console, otherwise I should have passed that ansi code to stdout.n";
    SetColor(GREEN);
    cout "I should be green if printed on the console, but I should have passed the escape sequence to the stdout pipe..n";
    char x;
    std::cin.get(x);
}

我希望在 stdout 上发送的字节级数据在所有 ansi 批准的文本中,包括颜色代码和光标移动转义序列。 我什至不确定这是否可能,但如果有人知道......这里将是知道它是否已经完成的地方。 我也愿意接受滚动我自己并将其添加到 ansicon 的可能性。

我在开源的KpyM Telnet/SSH服务器中看到的一种方法是使用GetConsoleScreenBufferInfoReadConsoleOutput

KTS 不是操作控制台 I/O 例程来发出终端转义序列,而是创建一个新的控制台窗口,并通过它拥有的句柄以及GetConsoleScreenBufferInfo(光标信息)和ReadConsoleOutput(屏幕信息,包括颜色)函数从中捕获数据。 捕获数据后,KTS向远端发出相应的终端转义序列以重现显示。

此行为不需要超出 Win32 API 中提供的挂钩,并且适用于交互式应用程序,但它可能会导致屏幕"撕裂",尤其是当大量输出转储到控制台并且 SSH 守护程序轮询速度不够快以跟上时。 此外,由于此机制使用轮询,因此它将消耗更多功率,尤其是在充当服务器的移动设备上,以及在具有朴素服务器实现的移动客户端上。 (智能服务器实现可以检测到没有任何更改,从而减少发送到移动客户端的数据。

如果您计划实现(或已经实现)适用于 Windows 的 SSH 守护程序,请不要忘记并非所有应用程序都需要此终端仿真行为 - 只有当您收到pty-req消息时,才应完成此终端仿真。 如果未收到pty-req消息,SSH 守护程序应仅中继标准输入/标准输出/标准错误流。

我很确定自Windows 2000以来,任何Windows操作系统都没有附带任何内容,其中包括对ANSI转义序列的支持。

这也是

有道理的,如果你考虑ANSI http://www.roysac.com/learn/ansisys.html 的局限性,只有16种颜色(是固定的),其中只有8种可用作背景颜色等。

除非你需要向后兼容那么久远的过去或出于怀旧的原因(最后一个类别实际上包括我自己:)),否则没有理由使用 ANSI 转义序列。

如果您查看文档(链接),您还将了解到旧的 ANSI 内容不是非常直观和易于使用,当然也不是直截了当的。旧的PCBoard ANSI等效编码@X00..@X7F(@X而不是CHR(27)"ESC",然后1字节BackColor(Hex)和1字节ForeColor(Hex)是:)在公园散步

虽然这有点麻烦,但您可以通过使用绕道并发出适当的 ANSI 转义序列来解决它。 在调用控制台 API 函数时,您将向标准输出流发出相应的转义序列。

(我希望有人提出更好的答案,因为,虽然这应该有效,但这是一个可怕的黑客。