2011-02-07 27 views
6

system("color 24"); kullanmayı denedim ancak bu komut isteminde rengi değiştirmedi. Daha fazla Googling'den sonra SetConsoleTextAttribute'u gördüm ve aşağıdaki kodu yazdım. Her iki stdout ve stderr yılındaWindows'ta stdout/stderr metin rengini ayarlama

Bu sonuçlar hem kırmızı olmak yerine yeşil olmak stdout ve stderr kırmızı renkli alıyorum.

Bunu nasıl çözebilirim? İsteğim de artık kırmızı ama bunu nasıl yapacağımı bildiğimden beri umurumda değil.

her çıkışın önce rengini ayarlamak için (VS 2010 cl kullanarak) ve düzenli bir cmd istemi

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

cevap

5

MSDN GetStdHandle() belgelerine göre, işlev tutamaçları aynı etkin konsol ekran arabelleğine döndürür. Bu özelliklerin bu tutamaçları kullanarak ayarlanması her zaman aynı arabelleği değiştirecektir. Bu nedenle doğru önce sağ çıktı aygıtına rengini belirtmek gerekiyor:

/* ... */ 

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

Bunu denedim yemin edebilirdim. kabul edilmiş –

0

deneyin çalıştırarak ben isteminden bu inşa ediyorum Şu anda Windows 7'de çalışacak mı . Kod çoğaltmasını önlemek için bunu bir işlevde yapabilirsiniz.

5

hatası ve normal konsol çıkışı için kulp aynıdır. Ya da daha çok, aynı konsol penceresine işaret ederler. Konsol rengini değiştirdiğinizde, bundan sonra yazılan tüm metne uygulanır, bu nedenle çıktıdan hemen önce rengi değiştirmeniz gerekir. Çıktınız her metin için bunu yapmak istemiyorsanız, çağrıları ayrı bir işleve dönüştürün:

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