获取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; }