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

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

есть такой фрагмент кода для linux:

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

теперь мне интересно, как я могу сделать то же самое для Windows. Я пытался!--1--> но он не определяет struct winsize ни любой другой с аналогичным именем.

какие-либо советы? Спасибо.

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

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

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

3 ответов


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

#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 меньше, чем фактическое значение, я добавил еще один.


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

этот код:

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 строк). Но!--2--> соответствует номеру столбца. Нужно только windows.h на работу.


ниже две функции получат размер окна несколько более непосредственно.

обратите внимание, что я обнаружил, используя gcc, что ни этот подход, ни GetConsoleScreenBufferInfo не работают, если программа передается по конвейеру. Это несколько больно, так как for/f тогда тоже не работает. По-видимому, данные экрана недоступны в трубе.

ГМ, вышеупомянутое замечание, конечно, чрезвычайно глупо. ;) Это STDOUT, который не является экраном в трубе! Это означает, что я предпочитаю использовать STD_ERROR_HANDLE над STD_OUTPUT_HANDLE. Я гораздо менее склонен направлять стандартную ошибку от экрана, чем стандартный вывод.

typedef struct _CONSOLE_FONT_INFO {
  DWORD nFont;
  COORD dwFontSize;
} CONSOLE_FONT_INFO, *PCONSOLE_FONT_INFO;

BOOL WINAPI GetCurrentConsoleFont(
   HANDLE             hConsoleOutput,
   BOOL               bMaximumWindow,
   PCONSOLE_FONT_INFO lpConsoleCurrentFont
);

/* Get the window width */
int getww_(void)
{
    CONSOLE_FONT_INFO info;
    GetCurrentConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &info);
    return info.dwFontSize.X;
}

/* Get the window height */
int getwh_(void)
{
    CONSOLE_FONT_INFO info;
    GetCurrentConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &info);
    return info.dwFontSize.Y;
}