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

6 c++ console window colors windows-7

我尝试使用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;
}
Run Code Online (Sandbox Code Playgroud)

小智 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;
Run Code Online (Sandbox Code Playgroud)


Xeo*_*Xeo 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");
}
Run Code Online (Sandbox Code Playgroud)