Получение размера терминала в c для Windows? - PullRequest
15 голосов
/ 25 июля 2011

Как проверить 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);
}

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

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

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

PPS.Кроме того, всегда существует ncurses.h, который, как я полагаю, работает на обеих системах, но я избегаю этого из-за конфликтов с другими имеющимися у меня библиотеками.

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

Ответы [ 3 ]

26 голосов
/ 28 сентября 2012

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

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

6 голосов
/ 25 июля 2011

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

Этот код:

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 для работы.

1 голос
/ 17 мая 2018

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

Обратите внимание, что, используя gcc, я обнаружил, что ни этот подход, ни GetConsoleScreenBufferInfo не работают, если программа передана по конвейеру.Это что-то вроде боли, поскольку / 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...