SetConsoleTextAttribute
这个函数并不是 C 语言的标准库函数,而是 Windows API (应用程序编程接口) 的一部分,它只能在 Windows 操作系统 上使用,如果你需要在 Linux 或 macOS 上实现类似功能,需要使用不同的方法(如 ANSI 转义码)。

(图片来源网络,侵删)
函数原型
在使用之前,你需要在你的 C 代码中包含 windows.h 头文件。
#include <windows.h> BOOL WINAPI SetConsoleTextAttribute( _In_ HANDLE hConsoleOutput, _In_ WORD wAttributes );
参数详解:
-
hConsoleOutput(控制台输出句柄)- 这是一个 句柄,可以理解为 Windows 用来标识“控制台输出窗口”的 ID。
- 你不能直接使用这个窗口的 ID,需要通过另一个 API 函数
GetStdHandle来获取它。 - 通常我们使用
STD_OUTPUT_HANDLE这个预定义常量来获取标准输出(也就是你的控制台窗口)的句柄。
-
wAttributes(颜色属性)- 这是一个 16位 的
WORD类型值(在windows.h中通常被定义为unsigned short)。 - 它的每一位都代表一个属性,但对于颜色控制,我们主要关心它的 低 4 位。
- 这 4 位分为两组:
- 高 2 位 (第 3, 4 位): 代表背景颜色。
- 低 2 位 (第 1, 2 位): 代表文本颜色。
- 这是一个 16位 的
颜色常量
Windows API 为我们预定义了表示颜色的宏,这些宏可以直接用在 wAttributes 参数中。

(图片来源网络,侵删)
| 颜色 | 宏定义 | 值 (十六进制) | 值 (十进制) | 二进制表示 (低4位) |
|---|---|---|---|---|
| 黑色 | 0 |
0x0 |
0 |
0000 |
| 蓝色 | FOREGROUND_BLUE |
0x1 |
1 |
0001 |
| 绿色 | FOREGROUND_GREEN |
0x2 |
2 |
0010 |
| 青色 | FOREGROUND_BLUE | FOREGROUND_GREEN |
0x3 |
3 |
0011 |
| 红色 | FOREGROUND_RED |
0x4 |
4 |
0100 |
| 洋红色 | FOREGROUND_RED | FOREGROUND_BLUE |
0x5 |
5 |
0101 |
| 黄色 | FOREGROUND_RED | FOREGROUND_GREEN |
0x6 |
6 |
0110 |
| 白色 | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE |
0x7 |
7 |
0111 |
| 亮灰色 | FOREGROUND_INTENSITY |
0x8 |
8 |
1000 |
| 亮蓝色 | FOREGROUND_BLUE | FOREGROUND_INTENSITY |
0x9 |
9 |
1001 |
| 亮绿色 | FOREGROUND_GREEN | FOREGROUND_INTENSITY |
0xA |
10 |
1010 |
| 亮青色 | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY |
0xB |
11 |
1011 |
| 亮红色 | FOREGROUND_RED | FOREGROUND_INTENSITY |
0xC |
12 |
1100 |
| 亮洋红色 | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY |
0xD |
13 |
1101 |
| 亮黄色 | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY |
0xE |
14 |
1110 |
| 亮白色 | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY |
0xF |
15 |
1111 |
背景颜色 使用类似的宏,只是前缀是 BACKGROUND_:
BACKGROUND_BLACK(0x0)BACKGROUND_BLUE(0x10)BACKGROUND_GREEN(0x20)BACKGROUND_RED(0x40)BACKGROUND_INTENSITY(0x80) 用于设置亮色背景
如何组合颜色
wAttributes 参数的值是通过 按位或 运算符 () 组合起来的。
公式:
wAttributes = 文本颜色_常量 | 背景颜色_常量;
示例:

(图片来源网络,侵删)
- 绿色文本,黑色背景:
FOREGROUND_GREEN | BACKGROUND_BLACK(值为0x2 | 0x0,即0x2) - 红色文本,蓝色背景:
FOREGROUND_RED | BACKGROUND_BLUE(值为0x4 | 0x10,即0x14) - 亮黄色文本,亮蓝色背景:
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_BLUE | BACKGROUND_INTENSITY(值为0xE | 0x90,即0x9E)
完整 C 语言代码示例
下面是一个完整的示例,它展示了如何设置不同的颜色并打印文本。
#include <stdio.h>
#include <windows.h> // 必须包含此头文件
// 定义一些颜色组合,方便使用
#define COLOR_RED_TEXT (FOREGROUND_RED | FOREGROUND_INTENSITY)
#define COLOR_GREEN_TEXT (FOREGROUND_GREEN | FOREGROUND_INTENSITY)
#define COLOR_BLUE_TEXT (FOREGROUND_BLUE | FOREGROUND_INTENSITY)
#define COLOR_YELLOW_TEXT (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY)
#define COLOR_WHITE_TEXT (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY)
#define COLOR_BLUE_BG (BACKGROUND_BLUE | BACKGROUND_INTENSITY)
#define COLOR_BLACK_BG (0)
void clearConsole() {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
COORD coordScreen = { 0, 0 };
DWORD cCharsWritten;
CONSOLE_SCREEN_BUFFER_INFO csbi;
DWORD dwConSize;
// 获取控制台屏幕缓冲区信息
if (!GetConsoleScreenBufferInfo(hConsole, &csbi)) {
printf("GetConsoleScreenBufferInfo failed\n");
return;
}
dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
// 用空格填充整个缓冲区
if (!FillConsoleOutputCharacter(hConsole, (TCHAR) ' ', dwConSize, coordScreen, &cCharsWritten)) {
printf("FillConsoleOutputCharacter failed\n");
return;
}
// 设置填充字符的属性
if (!FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten)) {
printf("FillConsoleOutputAttribute failed\n");
return;
}
// 将光标移动到左上角
SetConsoleCursorPosition(hConsole, coordScreen);
}
int main() {
// 1. 获取标准输出设备的句柄
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
if (hConsole == INVALID_HANDLE_VALUE) {
printf("Error: Could not get console handle.\n");
return 1;
}
// 2. 设置并打印不同颜色的文本
// 红色文本,黑色背景
SetConsoleTextAttribute(hConsole, COLOR_RED_TEXT | COLOR_BLACK_BG);
printf("This is red text.\n");
// 绿色文本,黑色背景
SetConsoleTextAttribute(hConsole, COLOR_GREEN_TEXT | COLOR_BLACK_BG);
printf("This is green text.\n");
// 蓝色文本,黑色背景
SetConsoleTextAttribute(hConsole, COLOR_BLUE_TEXT | COLOR_BLACK_BG);
printf("This is blue text.\n");
// 黄色文本,黑色背景
SetConsoleTextAttribute(hConsole, COLOR_YELLOW_TEXT | COLOR_BLACK_BG);
printf("This is yellow text.\n");
// 白色文本,黑色背景
SetConsoleTextAttribute(hConsole, COLOR_WHITE_TEXT | COLOR_BLACK_BG);
printf("This is white text.\n");
// 组合示例:红色文本,蓝色背景
SetConsoleTextAttribute(hConsole, FOREGROUND_RED | BACKGROUND_BLUE);
printf("This is red text on a blue background.\n");
// 3. (重要!)恢复默认颜色
// �
