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

标签 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。

最佳答案

我在开源中看到的一种方法 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/

相关文章:

c++ - 如何将文件路径和参数的执行路径分开?

java - 通过在java中模拟命令shell如何执行一个文件?

python - Powershell 和 Python - 如何以管理员身份运行命令

c++ - MPI 代码在超过 2 个节点/进程的最终确定时挂起

c++ - 我怎样才能得到一个返回自身的 boost::function (或其他通用函数包装器)?

c++ - 如何使用原始 Windows API 以编程方式将证书安装到用户的受信任发布者存储中?

windows - 将包提交到 Windows Phone 商店时出现无效的包标识错误

c# - 在 C# 应用程序中使用第 3 方上下文菜单(对于 Windows 资源管理器)?

c++ - Swift - C++ 的 CRC8 计算转换

windows - 删除所有保持文件不变的目录(Windows cmd)