Получение размера терминала в c для окон?

Как проверить ymax и xmax в окне консоли под Windows, используя простой c?

Существует этот фрагмент кода для linux:

#include <stdio.h>
#include <sys/ioctl.h>
int main (void)
{
    struct winsize max;
    ioctl(0, TIOCGWINSZ , &max);
    printf ("lines %d\n", max.ws_row);
    printf ("columns %d\n", max.ws_col);
}

Теперь мне интересно, как я могу сделать то же самое для Windows. Я пробовал winioctl.h, но он не определяет struct winsize, а другой - с похожим именем.

Какие-нибудь советы? Спасибо.

PS. В linux вы также можете найти размер консоли с помощью getenv("LINES");. Есть ли подобная переменная под окнами?

ПФС. Кроме того, всегда есть ncurses.h, я полагаю, что работаю обе системы, но я избегаю этого из-за конфликтов с другими библиотеками, которые у меня есть.

PPPS. Этот вопрос здесь Получение ширины терминала в C? содержит много советов, поэтому не нужно повторять это.

Ответ 1

(Частичный ответ)

Этот код:

CONSOLE_SCREEN_BUFFER_INFO csbi;
int ret;
ret = GetConsoleScreenBufferInfo(GetStdHandle( STD_OUTPUT_HANDLE ),&csbi);
if(ret)
{
    printf("Console Buffer Width: %d\n", csbi.dwSize.X);
    printf("Console Buffer Height: %d\n", csbi.dwSize.Y);
}

Дает размер буфера. Единственная проблема заключается в том, что dwSize.Y на самом деле не является размером экрана (здесь 300 вместо 25 строк). Но dwSize.X соответствует номеру столбца. Требуется только windows.h для работы.

Ответ 2

Отпечатает размер консоли, а не буфер:

#include <windows.h>

int main(int argc, char *argv[]) {
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    int columns, rows;

    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
    columns = csbi.srWindow.Right - csbi.srWindow.Left + 1;
    rows = csbi.srWindow.Bottom - csbi.srWindow.Top + 1;

    printf("columns: %d\n", columns);
    printf("rows: %d\n", rows);
    return 0;
}

Этот код работает, потому что srWindow "содержит координаты буфера экрана консоли в верхнем левом и нижнем правом углах окна дисплея", а структура SMALL_RECT "указывает строки и столбцы символа экранного буфера клеток" согласно MSDN. Я вычитал параллельные стороны, чтобы получить размер окна консоли. Поскольку я получил 1 меньше фактического значения, я добавил один.