Как я могу получить цветовые коды ANSI для работы в Windows CMD? - PullRequest
1 голос
/ 04 марта 2020

Как получить управляющие коды ANSI для вывода цветных выходов терминала на консоли CMD Windows с помощью консольного приложения C ++?

Это то, что я пробовал до сих пор:

 #include <windows.h>
 #ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING
 #define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
 #endif

 int main()
 {
    HANDLE h = GetStdHandle(STD_INPUT_HANDLE);
    SetConsoleMode(h, ENABLE_VIRTUAL_TERMINAL_PROCESSING);
    printf("%c[%dm foo!\n", 0x1B, 32);              // 1
    printf("\e[31m foo \e[0m bar\n");               // 2
    printf("^\u0001b[31m foo \u0001b[0m bar\n");    // 3
    printf("^[[31m foo");                           // 4
    printf("\033[1;31m foo \e[0m bar\n");           // 5

 };
  1. После этот поток , в C ++, printf("%c[%dmHELLO!\n", 0x1B, 32); должен работать, но это не так 't - для меня это выводит [32MHELLO!.
  2. printf("\e[31m foo \e[0m bar"); должен выводить красный foo и значение по умолчанию bar, но просто печатает ?[31m foo ?[0m bar.
  3. Замена \e на \u001b ничего не делает.
  4. Копирование работающей строки из окна cmd ^[[31m foo и использование ее в printf
  5. Переход с другим escape-символом, printf("\033[1;32m foo \e[0m bar");

Я также протестировал Выведите, используя printf("foo") и std::out << "foo"; для всех примеров, перечисленных выше. Ничего не работает Я мог бы понять, не были ли поддержаны полные цвета XTERM, но, по моему мнению, ANSI является базовым c ожиданием. Насколько я знаю, коды ANSI поддерживаются в окне командной строки по умолчанию. Вот почему я запутался по этому поводу.

ctrl + [, за которым следует 31m в окне Windows CMD, позволяет использовать ANSI окраску в окно - так почему я не могу сделать это из C ++?

Это не особенно актуальная проблема, но она все равно беспокоит меня. Я уверен, что это возможно, но я просто не могу заставить его работать.

...