Как я могу заставить цветовые коды ANSI работать в Windows CMD?

Как я могу получить escape-коды ANSI для вывода цветных выходных данных терминала в консоли Windows CMD с помощью консольного приложения 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);, но это не так - у меня выводится [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, на мой взгляд, является основным ожиданием. Насколько мне известно, коды ANSI поддерживаются в окне командной строки по умолчанию. Вот почему я в замешательстве по этому поводу.

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

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


person Alan Lovell    schedule 04.03.2020    source источник
comment
Обратите внимание, что это функция терминала, отображающая вывод вашей программы, независимо от того, на каком языке программирования эта программа реализована...   -  person DevSolar    schedule 04.03.2020
comment
@DevSolar - справедливое замечание, я скорректировал свой вопрос, чтобы попытаться сделать его немного яснее. Надеюсь, теперь это имеет немного больше смысла.   -  person Alan Lovell    schedule 04.03.2020
comment
Они МОГУТ быть поддержаны. Это пользовательские настройки и только более поздние сборки Windows 10. Этот метод является ЕДИНСТВЕННЫМ, который будет работать на всех версиях Windows с использованием стандартных вызовов API winsourcecode.blogspot.com/2019/12/   -  person    schedule 04.03.2020