请注意,您提到的 setconsoletext 可能是一个小小的笔误,在Windows API中,这个函数的正确名称是 SetConsoleTextAttribute,它的作用是设置控制台屏幕缓冲区中后续文本的字符属性,最主要的应用就是改变文本的颜色和背景色。

函数简介
SetConsoleTextAttribute 是 Windows API 中的一个函数,它位于 windows.h 头文件中,这个函数仅适用于 Windows 操作系统,在 Linux 或 macOS 的标准终端中无法使用。
函数原型:
BOOL SetConsoleTextAttribute( [in] HANDLE hConsoleOutput, [in] WORD wAttributes );
参数说明:
-
hConsoleOutput(输入): 一个 HANDLE (句柄),代表要修改的控制台屏幕缓冲区,我们使用GetStdHandle函数来获取标准输出(屏幕)的句柄。
(图片来源网络,侵删)STD_OUTPUT_HANDLE: 标准输出设备的句柄,就是我们通常看到的控制台窗口。
-
wAttributes(输入): 一个 WORD 类型的值(16位无符号整数),它是一个位掩码,组合了文本颜色和背景颜色,你可以使用预定义的宏来进行组合。
返回值:
- 如果成功,返回
TRUE(非零)。 - 如果失败,返回
FALSE(零),你可以调用GetLastError函数获取详细的错误信息。
颜色属性
颜色是通过组合不同的宏来定义的,这些宏通常在 windows.h 中定义。
文本颜色 (Foreground Colors)
这些宏需要与 FOREGROUND_ 前缀一起使用,或者直接使用它们的十六进制值。

| 宏 | 值 (十六进制) | 描述 |
|---|---|---|
FOREGROUND_RED |
0x0004 |
红色 |
FOREGROUND_GREEN |
0x0002 |
绿色 |
FOREGROUND_BLUE |
0x0001 |
蓝色 |
FOREGROUND_INTENSITY |
0x0008 |
亮度(加粗/高亮) |
FOREGROUND_WHITE |
0x0007 |
(红色+绿色+蓝色) 白色 |
背景颜色 (Background Colors)
这些宏需要与 BACKGROUND_ 前缀一起使用。
| 宏 | 值 (十六进制) | 描述 |
|---|---|---|
BACKGROUND_RED |
0x0040 |
红色 |
BACKGROUND_GREEN |
0x0020 |
绿色 |
BACKGROUND_BLUE |
0x0010 |
蓝色 |
BACKGROUND_INTENSITY |
0x0080 |
亮度(更亮的背景) |
BACKGROUND_WHITE |
0x0070 |
(红色+绿色+蓝色) 白色 |
常用组合
在实际使用中,我们通常使用 (按位或) 运算符将前景色和背景色组合起来。
| 组合值 | 预定义宏 (如果存在) | 描述 |
|---|---|---|
FOREGROUND_RED \| BACKGROUND_GREEN |
- | 红字绿底 |
FOREGROUND_GREEN \| BACKGROUND_BLUE |
- | 绿字蓝底 |
FOREGROUND_BLUE \| BACKGROUND_INTENSITY |
- | 蓝字亮底 |
FOREGROUND_WHITE \| BACKGROUND_RED |
- | 白字红底 |
FOREGROUND_RED \| FOREGROUND_GREEN \| FOREGROUND_BLUE |
FOREGROUND_WHITE |
白字黑底(默认) |
FOREGROUND_RED \| FOREGROUND_GREEN \| FOREGROUND_BLUE \| FOREGROUND_INTENSITY |
FOREGROUND_WHITE \| FOREGROUND_INTENSITY |
亮白字黑底(加粗) |
完整示例代码
下面是一个完整的C语言示例,它会演示如何输出不同颜色和背景的文本。
#include <stdio.h>
#include <windows.h> // 必须包含此头文件
// 为了方便,定义一些颜色组合
#define COLOR_RED (FOREGROUND_RED | FOREGROUND_INTENSITY)
#define COLOR_GREEN (FOREGROUND_GREEN | FOREGROUND_INTENSITY)
#define COLOR_BLUE (FOREGROUND_BLUE | FOREGROUND_INTENSITY)
#define COLOR_YELLOW (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY)
#define COLOR_CYAN (FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY)
#define COLOR_MAGENTA (FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY)
#define COLOR_WHITE (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY)
// 背景色需要单独设置
#define BG_RED (BACKGROUND_RED)
#define BG_GREEN (BACKGROUND_GREEN)
#define BG_BLUE (BACKGROUND_BLUE)
#define BG_WHITE (BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE)
int main() {
// 1. 获取标准输出设备的句柄
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
if (hConsole == INVALID_HANDLE_VALUE) {
printf("无法获取控制台句柄,\n");
return 1;
}
// 2. 设置并输出不同颜色的文本
// 注意:SetConsoleTextAttribute 会影响之后所有的输出,直到再次被修改。
// 红色文本
SetConsoleTextAttribute(hConsole, COLOR_RED);
printf("这是红色文本,\n");
// 绿色文本
SetConsoleTextAttribute(hConsole, COLOR_GREEN);
printf("这是绿色文本,\n");
// 蓝色文本
SetConsoleTextAttribute(hConsole, COLOR_BLUE);
printf("这是蓝色文本,\n");
// 黄色文本 (红+绿)
SetConsoleTextAttribute(hConsole, COLOR_YELLOW);
printf("这是黄色文本,\n");
// 白色文本
SetConsoleTextAttribute(hConsole, COLOR_WHITE);
printf("这是白色文本,\n");
// 3. 设置带背景色的文本
// 红字绿底
SetConsoleTextAttribute(hConsole, COLOR_RED | BG_GREEN);
printf("这是红字绿底的文本,\n");
// 蓝字白底
SetConsoleTextAttribute(hConsole, COLOR_BLUE | BG_WHITE);
printf("这是蓝字白底的文本,\n");
// 4. 恢复默认颜色 (黑底白字)
// 默认颜色是 FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE (白色文本)
// 背景色默认是黑色 (无背景色宏)
SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
printf("\n程序结束,已恢复默认颜色,\n");
// 等待用户按键,以便看清输出效果
system("pause");
return 0;
}
如何编译和运行
- 将上述代码保存为
color_console.c。 - 打开 Visual Studio 的开发者命令提示 (x64 Native Tools Command Prompt) 或 MinGW 的终端。
- 使用 gcc 进行编译:
gcc color_console.c -o color_console.exe
- 运行生成的可执行文件:
color_console.exe
你将会看到一个彩色的控制台输出窗口。
跨平台解决方案
由于 SetConsoleTextAttribute 是 Windows 特有的,如果你需要编写跨平台的彩色控制台程序,可以考虑使用第三方库。
最著名的是 ncurses 库。
ncurses: 它是一个用于创建基于文本的用户界面的库,在 Unix-like 系统(Linux, macOS)上是标准库,通过一些包装库,它也可以在 Windows 上工作。
使用 ncurses 的简单示例 (Linux/macOS):
#include <ncurses.h> // ncurses 头文件
int main() {
// 初始化 ncurses 模式
initscr();
cbreak(); // 禁用行缓冲
noecho(); // 不显示用户输入的字符
// 设置颜色对 (需要先调用 start_color())
start_color();
init_pair(1, COLOR_RED, COLOR_BLACK); // 颜色对1: 红字黑底
init_pair(2, COLOR_GREEN, COLOR_WHITE); // 颜色对2: 绿字白底
// 使用颜色对1打印
attron(COLOR_PAIR(1));
printw("这是红色文本,\n");
attroff(COLOR_PAIR(1));
// 使用颜色对2打印
attron(COLOR_PAIR(2));
printw("这是绿色白底的文本,\n");
attroff(COLOR_PAIR(2));
// 刷新屏幕,显示所有内容
refresh();
// 等待按键
getch();
// 结束 ncurses 模式,恢复终端
endwin();
return 0;
}
编译 ncurses 程序 (Linux):
gcc my_ncurses_app.c -o my_ncurses_app -lncurses
| 方法 | 优点 | 缺点 | 适用平台 |
|---|---|---|---|
SetConsoleTextAttribute |
简单直接,是Windows的一部分,无需额外安装。 | 仅限Windows,不具备跨平台性。 | Windows |
ncurses |
跨平台功能强大,提供丰富的文本UI功能。 | 需要额外安装库,API比Windows的更复杂。 | Linux, macOS, Windows (通过端口) |
如果你的程序只在Windows上运行,SetConsoleTextAttribute 是最简单、最直接的选择,如果你的程序需要跨平台,ncurses 是更好的选择。
