2011-02-07 13 views
6

Intenté usar system("color 24"); pero eso no cambió el color en el aviso. Así que después de buscar en Google, vi SetConsoleTextAttribute y escribí el siguiente código.Configuración del color del texto stdout/stderr en Windows

Estos resultados, tanto en stdout y stderr tanto el conseguir de color rojo en lugar de ser verde y stdoutstderr siendo rojo.

¿Cómo soluciono esto? Mi mensaje ahora también es rojo, pero no me importa, ya que sé cómo solucionarlo.

Debería funcionar en Windows 7. En este momento estoy construyendo esto desde el símbolo (utilizando VS 2010 cl) y ejecutarlo en un habitual cmd pronta

#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; 
} 

Respuesta

5

De acuerdo con la documentación de MSDN GetStdHandle(), la función devolverá identificadores al mismo búfer de pantalla de la consola activa. Por lo tanto, establecer atributos usando estos controles siempre cambiará el mismo buffer. Debido a esto se tiene que especificar el color justo antes de la derecha al dispositivo de salida:

/* ... */ 

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; 
+0

Podría haber jurado que lo intenté. aceptado –

0

intenta establecer el color antes de cada salida . Puede hacerlo en una función para evitar la duplicación de código.

5

El mango para el error y salida de la consola normal, son los mismos. O más bien, apuntan a la misma ventana de consola. Cuando cambias el color de la consola, se aplica a todo el texto escrito después de eso, por lo que necesitarías cambiar el color directamente antes de la salida. Si no desea hacer eso para cada texto que genera, empaque las llamadas en una función separada:

#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"); 
} 
Cuestiones relacionadas