2011-02-07 4 views
6

Ho provato a utilizzare system("color 24"); ma questo non ha cambiato il colore nel prompt. Quindi dopo un po 'su Google ho visto SetConsoleTextAttribute e ho scritto il codice seguente.Impostazione del colore del testo stdout/stderr in Windows

Questo risultati sia stdout e stderr sia sempre di colore rosso, invece di stdout essere verde e stderr essere rosso.

Come posso risolvere questo? Il mio prompt è ora rosso ma non mi interessa perché so come risolverlo.

Dovrebbe funzionare in Windows 7. Al momento sto costruendo questo dal prompt (utilizzando VS 2010 cl) ed eseguirlo in un normale 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; 
} 

risposta

5

In base alla documentazione MSDN GetStdHandle(), la funzione restituirà gli handle allo stesso buffer di schermo della console attivo. Quindi, l'impostazione degli attributi usando questi handle cambierà sempre lo stesso buffer. Per questo motivo è necessario specificare il colore prima del diritto al dispositivo di output:

/* ... */ 

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

Avrei potuto giurare di averlo provato. accettato –

0

tenta di impostare il colore prima di ogni uscita . Puoi farlo in una funzione per evitare la duplicazione del codice.

5

L'handle per l'errore e l'output normale della console sono gli stessi. O più, puntano alla stessa finestra della console. Quando cambi il colore della console, si applica a tutto il testo scritto dopo di esso, quindi dovrai cambiare il colore direttamente prima dell'output. Se non vuoi farlo per ogni testo che scrivi, configura le chiamate in una funzione separata:

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