如何解决使用自定义屏幕缓冲区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代码,则看起来像这样
如果我不在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
,
虚拟终端序列是控制字符序列,可以 在以下情况下控制光标移动,颜色/字体模式和其他操作 写入输出流。序列也可以在 输入流响应输出流查询信息 顺序或作为用户输入的编码(适当的模式为 设置。
您可以使用GetConsoleMode和SetConsoleMode函数进行配置 这种行为。
从ENABLE_VIRTUAL_TERMINAL_PROCESSING,我们可以使用WriteFile
或WriteConsole
来实现。
某些代码:
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);
调试:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。