gpt4 book ai didi

c++ - 有没有办法让windows输出ansi转义序列

转载 作者:可可西里 更新时间:2023-11-01 10:36:37 24 4
gpt4 key购买 nike

有没有办法在内部控制台颜色更改后让 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是使用 GetConsoleScreenBufferInfoReadConsoleOutput .

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com