Есть ли способ заставить Windows выводить ANSI escape-последовательности

Есть ли способ заставить Windows выводить escape-последовательности ANSI после изменения цвета внутренней консоли?
Я знаю о таких вещах, как ansicon, которые будут выводить escape-последовательности INTERPRET ansi при запуске программы, но мне интересно, есть ли способ, которым окна будут пересылать эти escape-последовательности через stdout.
Например


#include
#include
using namespace std;
HANDLE hCon;

enum Color { DARKBLUE = 1, DARKGREEN, DARKTEAL, DARKRED, DARKPINK, DARKYELLOW, GRAY, DARKGRAY, BLUE, GREEN, TEAL, RED, PINK, YELLOW, WHITE };

void SetColor(Color c){
if(hCon == NULL)
hCon = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon, c);
}

int main()
{
std::cout "\x1b[31;1m  I should be red if printed on the console, otherwise I should have passed that ansi code to stdout.\n";
SetColor(GREEN);
cout "I should be green if printed on the console, but I should have passed the escape sequence to the stdout pipe..\n";
char x;
std::cin.get(x);
}

Я хочу, чтобы данные уровня байтов, отправляемые на стандартный вывод, были во ВСЕМ тексте, одобренном ANSI, включая цветовые коды и экранированные последовательности перемещения курсора … Я даже не уверен, что это возможно, но если кто-то знал … ЗДЕСЬ было бы местом, чтобы узнать если это уже было сделано. Я также открыт для возможности прокручивать свои собственные и добавлять их в ansicon.

2

Решение

Подход, который я видел в open-source KpyM Telnet / SSH Server было использование GetConsoleScreenBufferInfo а также ReadConsoleOutput.

Вместо того, чтобы манипулировать подпрограммами консольного ввода-вывода для генерации escape-последовательностей терминала, KTS создает новое консольное окно и получает данные из него с помощью принадлежащих ему дескрипторов и GetConsoleScreenBufferInfo (информация о курсоре) и ReadConsoleOutput (информация на экране, включая цвета) функции. После захвата данных KTS отправляет соответствующие escape-последовательности терминала на удаленный конец, чтобы воспроизвести дисплей.

Это поведение не требует никаких хуков, кроме того, что предусмотрено в Win32 API, и хорошо работает для интерактивных приложений, но может привести к «разрыву» экрана, особенно когда большой объем вывода выводится на консоль, а демон SSH не опрашивает быстро достаточно, чтобы не отставать. Кроме того, поскольку этот механизм использует опрос, он будет потреблять больше энергии, особенно на мобильных устройствах, выполняющих функции сервера, и на мобильных клиентах с простой реализацией сервера. (Реализация интеллектуального сервера может обнаружить, что ничего не изменилось, сокращая объем данных, отправляемых на мобильный клиент.)

Если вы планируете внедрить (или уже внедрили) демон SSH для Windows, не забывайте, что не все приложения будут хотеть этого поведения эмуляции терминала — только когда вы получите pty-req сообщение, если эта эмуляция терминала будет выполнена. Если вы не получили pty-req сообщение, демон SSH должен просто ретранслировать стандартные входные / стандартные выходные / стандартные потоки ошибок.

1

Другие решения

Я почти уверен, что с Windows 2000 нет ничего, что поставляется с любой ОС Windows, которая включает поддержку последовательностей ANSI Escape.

Это также имеет смысл, если учесть ограничения ANSI http://www.roysac.com/learn/ansisys.html, всего 16 цветов (которые исправлены), только 8 из них можно использовать в качестве фона и т. д.

Если вам не нужна обратная совместимость в далеком прошлом или по ностальгическим причинам (эта последняя категория включает в себя и меня на самом деле :)), нет смысла использовать ANSI Escape-последовательности.

Если вы посмотрите на документацию (ссылку), вы также узнаете, что старый материал ANSI не очень интуитивно понятен и прост в использовании, и, конечно, не совсем понятен. Старая PCBoard ANSI эквивалентная кодировка @ X00 .. @ X7F (@X вместо CHR (27) «ESC», тогда 1 байтовый BackColor (Hex) и 1 байтовый ForeColor (Hex) был сравнительно прогулкой в ​​парке 🙂

0

Хотя это немного сложная задача, вы можете решить ее с помощью Обходы и испускание соответствующих escape-последовательностей ANSI. При вызовах функций API консоли вы должны передавать соответствующие escape-последовательности в стандартный поток вывода.

(Я надеюсь, что кто-то предложит лучший ответ, потому что, хотя это должно сработать, это ужасный хак.)

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector