2011-02-07 37 views
6

Tôi đã thử sử dụng system("color 24"); nhưng điều đó không thay đổi màu trong lời nhắc. Vì vậy, sau khi nhiều Googling tôi thấy SetConsoleTextAttribute và đã viết mã dưới đây.Đặt màu chữ stdout/stderr trong Windows

Kết quả này ở cả hai stdoutstderr cả hai đều nhận được màu đỏ thay vì stdout là màu xanh lá cây và stderr là màu đỏ.

Làm cách nào để giải quyết vấn đề này? Lời nhắc của tôi hiện cũng là màu đỏ nhưng tôi không quan tâm đến điều đó vì tôi biết cách khắc phục.

nên làm việc trong Windows 7. Tại thời điểm tôi đang xây dựng này từ dấu nhắc (sử dụng VS 2010 cl) và chạy nó trong một thường xuyên cmd nhắc

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

Trả lời

5

Theo tài liệu MSDN GetStdHandle(), hàm sẽ trả về các chốt xử lý cho cùng một bộ đệm màn hình bàn điều khiển hoạt động. Vì vậy, việc thiết lập các thuộc tính bằng cách sử dụng các chốt này sẽ luôn thay đổi cùng một bộ đệm. Vì lý do này, bạn phải chỉ định màu ngay trước khi bạn chuyển sang thiết bị đầu ra:

/* ... */ 

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

Tôi có thể thề là tôi đã thử điều đó. được chấp nhận –

0

Cố gắng thiết lập các màu sắc trước khi mỗi đầu ra . Bạn có thể làm điều đó trong một hàm để tránh trùng lặp mã.

5

Xử lý lỗi và đầu ra bàn điều khiển bình thường là như nhau. Hoặc giống như, họ trỏ đến cùng một cửa sổ giao diện điều khiển. Khi bạn thay đổi màu giao diện điều khiển, nó áp dụng cho tất cả văn bản được viết sau đó, vì vậy bạn cần phải thay đổi màu sắc trực tiếp trước khi xuất. Nếu bạn không muốn làm điều đó cho mọi văn bản bạn xuất, hãy gói các cuộc gọi vào một chức năng riêng biệt:

#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"); 
} 
Các vấn đề liên quan