Получение размера терминала в 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;
}