有没有办法让窗口输出 ansi 转义序列
Is there a way to make windows output ansi escape sequences
有没有办法在内部控制台颜色更改后使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服务器中看到的一种方法是使用GetConsoleScreenBufferInfo
和ReadConsoleOutput
。
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 函数时,您将向标准输出流发出相应的转义序列。
(我希望有人提出更好的答案,因为,虽然这应该有效,但这是一个可怕的黑客。
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- 将值从二维数组输出到文本文件
- 集合上的输出迭代器:assign和increment迭代器
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 为什么rk4.do_step不输出C++中的初始条件
- 如何使用ANSI转义码在C和c++中输出彩色文本
- 有没有办法让窗口输出 ansi 转义序列