在Windows中设置stdout / stderr文本颜色

时间:2011-02-07 11:19:24

标签: c++ windows-7 colors console window

我尝试使用system("color 24");但未改变提示中的颜色。所以经过更多谷歌搜索后,我看到了SetConsoleTextAttribute,并编写了以下代码。

这导致stdoutstderr都变为红色而不是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;
}

3 个答案:

答案 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)

尝试在每次输出前设置颜色。您可以在函数中执行此操作以避免代码重复。