内部控制台颜色更改后,是否有办法使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 Server中看到的一种方法是使用 GetConsoleScreenBufferInfo
和 ReadConsoleOutput
。
KTS无需操纵控制台I/O例程来发出终端转义序列,而是创建一个新的控制台窗口并通过其拥有的句柄以及GetConsoleScreenBufferInfo
(光标信息)和ReadConsoleOutput
(屏幕信息,包括颜色)功能从中捕获数据。 。捕获数据后,KTS将适当的终端转义序列发送到远端以重现显示。
此行为不需要Win32 API中提供的钩子(Hook),并且对于交互式应用程序也能很好地工作,但是它可能会导致屏幕“撕裂”,尤其是当大量输出转储到控制台并且SSH守护进程无法快速轮询时足以跟上。此外,由于此机制使用轮询,因此将消耗更多功率,尤其是在充当服务器的移动设备上以及在具有纯服务器实现的移动客户端上。 (智能服务器实现可以检测到没有任何变化,从而减少了发送到移动客户端的数据。)
如果您打算为Windows实现(或已经实现)SSH守护程序,请不要忘记并非所有应用程序都需要这种终端仿真行为-仅当收到pty-req
消息时,才应进行此终端仿真。如果未收到pty-req
消息,则SSH守护程序应仅中继标准输入/标准输出/标准错误流。
关于c++ - 有没有办法让Windows输出ansi转义序列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22777142/