Как получить текущие цвета фона и текста консоли?

Я знаю, как их установить (SetConsoleTextAttribute), но для получения этой информации нет GetConsoleTextAttribute. На незатронутой консоли это должно быть int 7.

Проблема заключается в том, что при выходе из программы, которая устанавливает цвет текста, она остается неизменной для времени, за которое запускается данное окно, и я не могу предположить, что пользователь не задал цвета по своему вкусу.

Ответ 1

Быстрый вывод wincon.h показывает, что CONSOLE_SCREEN_BUFFER_INFO имеет член wAttributes, который задокументирован как "Атрибуты символов, записанных в экранный буфер функциями WriteFile и WriteConsole, или отражены в экранный буфер функциями ReadFile и ReadConsole. " Это соответствует описанию SetConsoleTextAttribute: "Устанавливает атрибуты символов, записываемых в буфер экрана консоли с помощью функции WriteFile или WriteConsole или отражаемых функцией ReadFile или ReadConsole". Структура возвращается GetConsoleScreenBufferInfo.

Ответ 2

Благодаря Talent25 я сделал эту функцию:

#include <Windows.h>    
bool GetColor(short &ret){
        CONSOLE_SCREEN_BUFFER_INFO info;
        if (!GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info))
            return false;
        ret = info.wAttributes;
        return true;
}

используя его:

GetColor(CurrentColor);

CurrentColor - переменная для выходного числа цвета (фон * 16 + основной цвет). Возвращаемое значение сообщает, что действие выполнено успешно.

Ответ 3

Вот фрагмент кода.

HANDLE                      m_hConsole;
WORD                        m_currentConsoleAttr;
CONSOLE_SCREEN_BUFFER_INFO   csbi;

//retrieve and save the current attributes
m_hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
if(GetConsoleScreenBufferInfo(m_hConsole, &csbi))
    m_currentConsoleAttr = csbi.wAttributes;

//change the attribute to what you like
SetConsoleTextAttribute (
            m_hConsole,
            FOREGROUND_RED |
            FOREGROUND_GREEN);

//set the ttribute to the original one
SetConsoleTextAttribute (
            m_hConsole,
            m_currentConsoleAttr);