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

时间:2014-04-01 04:57:00

标签: c++ windows cmd console ansi

在内部控制台颜色变化后,有没有办法让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。

3 个答案:

答案 0 :(得分:1)

我在开源KpyM Telnet/SSH Server中看到的方法是使用GetConsoleScreenBufferInfoReadConsoleOutput

KTS不是操纵控制台I / O例程来发出终端转义序列,而是创建一个新的控制台窗口,并通过它拥有的句柄和GetConsoleScreenBufferInfo(游标信息)和{{1}从中捕获数据。 (屏幕上的信息,包括颜色)功能。在捕获数据之后,KTS将适当的终端转义序列发送到远程端以再现显示。

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

如果您计划实施(或已经实施)Windows的SSH守护程序,请不要忘记并非所有应用程序都需要此终端仿真行为 - 只有当您收到ReadConsoleOutput消息时才应该这样做终端仿真完成。如果您没有收到pty-req消息,则SSH守护程序应该只传递标准输入/标准输出/标准错误流。

答案 1 :(得分:0)

我很确定自Windows 2000以来,任何Windows操作系统都没有包含对ANSI Escape序列的支持。

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

除非您需要向后兼容过去或怀旧的原因(最后一类实际上包括我自己):),否则没有理由使用ANSI Escape序列。

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

答案 2 :(得分:0)

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

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