使用自定义屏幕缓冲区C ++在Windows控制台中启用ANSI Color支持

问题描述

我正在尝试通过CreateConsoleScreenBuffer()为创建的控制台屏幕缓冲区启用ANSI颜色支持。

hConsole = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE,NULL,CONSOLE_TEXTMODE_BUFFER,NULL);

DWORD dwMode = 0;
GetConsoleMode(hConsole,&dwMode);
dwMode |= ENABLE_EXTENDED_FLAGS;
SetConsoleMode(hConsole,dwMode);

dwMode = 0;
GetConsoleMode(hConsole,&dwMode);
dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
SetConsoleMode(hConsole,dwMode);

SetConsoleActiveScreenBuffer(hConsole);

SetConsoleMode()似乎什么都没做,我可以按预期将其写入缓冲区,但是如果我尝试编写任何ANSI Escape代码,则看起来像这样

ansii

如果我不在CreateConsoleScreenBuffer()创建的缓冲区中,则ANSI Escape代码按预期工作。

编辑:我在Windows 10上19041.388; C ++ 14,MinGW-64编译器

解决方法

您可以使用此:

#include <windows.h>
#include <iostream>
void Color(int color=0x07)
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color);
}
int main()
{
    Color(0x0A/*Black bg green Fg*/);
    std::cout << "Hello";
    Color();
    std::cout << ",";
    Color(0xAC/*Green bg red Fg*/);
     std::cout << "World";
    Color(/*Black bg white Fg*/);
}

有关颜色的更多信息:

颜色属性由两个十六进制数字指定-第一个 对应于背景;第二个前景。每个数字 可以是以下任意值:

0 = Black       8 = Gray
1 = Blue        9 = Light Blue
2 = Green       A = Light Green
3 = Aqua        B = Light Aqua
4 = Red         C = Light Red
5 = Purple      D = Light Purple
6 = Yellow      E = Light Yellow
7 = White       F = Bright White
,

虚拟终端序列是控制字符序列,可以 在以下情况下控制光标移动,颜色/字体模式和其他操作 写入输出流。序列也可以在 输入流响应输出流查询信息 顺序或作为用户输入的编码(适当的模式为 设置。

您可以使用GetConsoleModeSetConsoleMode函数进行配置 这种行为。

ENABLE_VIRTUAL_TERMINAL_PROCESSING,我们可以使用WriteFileWriteConsole来实现。

某些代码:

HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

HANDLE hConsole_c = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE,NULL,CONSOLE_TEXTMODE_BUFFER,NULL);
SetConsoleActiveScreenBuffer(hConsole_c);
DWORD dwMode = 0;
GetConsoleMode(hConsole_c,&dwMode);
dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
SetConsoleMode(hConsole_c,dwMode);

const char* str = "\x1b[31mThis text has restored the foreground color only.\r\n";
DWORD len = strlen(str);
DWORD dwBytesWritten = 0;

WriteConsole(hConsole_c,str,len,&dwBytesWritten,NULL);

调试:

image

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...