获取Windows的终端大小?

如何在Windows下使用普通c在控制台窗口中检查ymax和xmax?

这段代码用于linux:

#include  #include  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");找到控制台大小getenv("LINES"); 。 在Windows下是否有类似的变量?

PPS。 此外,总是有ncurses.h ,我认为这两个系统都可以工作,但是由于与我所拥有的其他库的冲突,我正在避免它。

购买力平价。 这个问题在这里获得C的终端宽度? 有很多提示,所以不需要重复。

这将打印控制台的大小,而不是缓冲区:

 #include  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行)。 但是dwSize.X与列的编号匹配。 只需要windows.h才能工作。

以下两个函数将更直接地获得窗口大小。

请注意,我发现,使用gcc,如果程序是通过管道传输,则此方法和GetConsoleScreenBufferInfo都不起作用。 这有点痛苦,因为/ f然后也不起作用。 显然,管道中没有屏幕数据。

嗯,上面这句话当然是非常愚蠢的。 ;)STDOUT不是管道中的屏幕! 这意味着我更喜欢在STD_OUTPUT_HANDLE之上使用STD_ERROR_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; }