我尝试使用system("color 24");
但未改变提示中的颜色。所以经过更多谷歌搜索后,我看到了SetConsoleTextAttribute
,并编写了以下代码。
这导致stdout
和stderr
都变为红色而不是stdout
为绿色且stderr
为红色。
我该如何解决这个问题?我的提示现在也是红色的,但我不在乎,因为我知道如何解决它。
应该在Windows 7中工作。目前我正在从提示符(使用VS 2010 cl)构建它并在常规cmd
提示符中运行它
#include <windows.h>
#include <stdio.h>
int main(int argc, char **argv)
{
int i;
unsigned long totalTime=0;
HANDLE hConsoleOut; //handle to the console
hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsoleOut, FOREGROUND_GREEN);
HANDLE hConsoleErr;
hConsoleErr = GetStdHandle(STD_ERROR_HANDLE);
SetConsoleTextAttribute(hConsoleErr, FOREGROUND_RED);
fprintf(stdout, "%s\n", "out");
fprintf(stderr, "%s\n", "err");
return 0;
}
答案 0 :(得分:5)
根据MSDN GetStdHandle()
文档,该函数将句柄返回到同一活动控制台屏幕缓冲区。因此,使用这些句柄设置属性将始终更改相同的缓冲区。因此,您必须在右侧输出设备之前指定颜色:
/* ... */
HANDLE hConsoleOut; //handle to the console
HANDLE hConsoleErr;
hConsoleErr = GetStdHandle(STD_ERROR_HANDLE);
hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsoleOut, FOREGROUND_GREEN);
fprintf(stdout, "%s\n", "out");
SetConsoleTextAttribute(hConsoleErr, FOREGROUND_RED);
fprintf(stderr, "%s\n", "err");
return 0;
答案 1 :(得分:5)
错误和正常控制台输出的句柄是相同的。或者更像是,它们指向同一个控制台窗口。更改控制台颜色时,它适用于之后写入的所有文本,因此您需要在输出之前直接更改颜色。如果您不想对输出的每个文本执行此操作,请将调用打包为单独的函数:
#include <windows.h>
#include <stdio.h>
// global vars (better pack it in a class)
// initialize both to normal white color
#define FOREGROUND_WHITE (FOREGORUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN)
int g_console_out_color = FOREGROUND_WHITE;
int g_console_err_color = FOREGROUND_WHITE;
HANDLE g_console_out_handle = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE g_console_err_handle = GetStdHandle(STD_ERROR_HANDLE);
void SetConsoleOutColor(int color){
g_console_out_color = color;
}
void SetConsoleErrColor(int color){
g_console_err_color = color;
}
void PrintOut(const char* format, ...){
SetConsoleTextAttribute(g_console_out_handle, g_console_out_color);
va_list args;
va_start(args, str);
fprintf(stdout, format, args);
va_end(args);
// set color back to normal
SetConsoleTextAttribute(g_console_out_handle, FOREGROUND_WHITE);
}
void PrintErr(const char* format, ...){
SetConsoleTextAttribute(g_console_err_handle, g_console_err_color);
va_list args;
va_start(args, str);
fprintf(stderr, format, args);
va_end(args);
// set color back to normal
SetConsoleTextAttribute(g_console_err_handle, FOREGROUND_WHITE);
}
int main(void){
PrintOut("%s\n", "out");
PrintErr("%s\n", "err");
}
答案 2 :(得分:0)
尝试在每次输出前设置颜色。您可以在函数中执行此操作以避免代码重复。