Home > front end >  ReadConsoleOutputAttribute function usage in c
ReadConsoleOutputAttribute function usage in c

Time:04-20

I need to get background color by known coord in c . I tried to use ReadConsoleOutputAttribute from windows.h, but i didn't work. Here is my code:

HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD count;
COORD cursor = { this->X, this->Y };
LPWORD *lpAttr = new LPWORD;
CONSOLE_SCREEN_BUFFER_INFO info;
GetConsoleScreenBufferInfo(console, &info);

ReadConsoleOutputAttribute(console, *lpAttr, 1, cursor, &count);

What's wrong here and what's the way to fix it? Do I suppose to get background color from lpAttr or what?

CodePudding user response:

Color attributes are specified by TWO hex digits -- the first corresponds to the background; the second the foreground. Each digit can be any of the following values:

0 = Black       8 = Gray
1 = Blue        9 = Light Blue
2 = Green       A = Light Green
3 = Aqua        B = Light Aqua
4 = Red         C = Light Red
5 = Purple      D = Light Purple
6 = Yellow      E = Light Yellow
7 = White       F = Bright White

We only need to extract the first digit of the hexadecimal result to know the background color of the current coordinate.This is my test code. I modified the mouse coordinate points to simplify the test.

#include <Windows.h>
#include <iostream>

using namespace std;

int main()
{
    //color set test
    system("color F0");
    std::cout << "Hello World!\n" << endl;

    HANDLE Console = GetStdHandle(STD_OUTPUT_HANDLE);
    if (!Console)
        return 0;

    CONSOLE_SCREEN_BUFFER_INFO buf;
    GetConsoleScreenBufferInfo(Console, &buf);

    WORD Attr;
    DWORD Count;
    COORD pos = buf.dwCursorPosition;
    ReadConsoleOutputAttribute(Console, &Attr, 1, pos, &Count);

    //hexadecimal out
    cout  << hex << Attr << endl;
    
    if (Attr)
    {   //extract the first digit of the hexadecimal result
        int color = Attr / 16;
        switch (color)
        {
           case 0:cout  << " background color is Black. "     << endl; break;
           case 1:cout  << " background color is Blue. "      << endl;break;
           case 2:cout  << " background color is Green . "    << endl; break;
           case 3:cout  << " background color is Aqua. "      << endl; break;
           case 4:cout  << " background color is Red. "       << endl; break;
           case 5:cout  << " background color is Purple . "   << endl; break;
           case 6:cout  << " background color is Yellow. "    << endl; break;
           case 7:cout  << " background color is White. "     << endl; break;
           case 8:cout  << " background color is Gray . "     << endl; break;
           case 9:cout  << " background color is Light Blue." << endl; break;
           case 10:cout << " background color is Light Green." << endl; break;      //A
           case 11:cout << " background color is Light Aqua ." << endl; break;      //B
           case 12:cout << " background color is Light Red . " << endl; break;      //C
           case 13:cout << " background color is Light Purple . " << endl; break;   //D
           case 14:cout << " background color is Light Yellow . " << endl; break;   //E
           case 15:cout << " background color is Bright White . " << endl; break;   //F
           default:
               cout << " error color " << endl;
               break;
        }
    }

    return 0;
}
  • Related