2011-07-25 34 views
13

如何使用plain c在Windows下的控制台窗口中检查ymax和xmax?在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。这里的问题Getting terminal width in C?有很多提示,所以不需要重复说明。

回答

3

(部分回答)

此代码:

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工作。

21

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

#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,我添加了一个。

+0

我很短的时间来测试它,但它看起来像这是问题的正确答案。你介意指出这个答案与当前接受的答案之间的区别,它显示了缓冲区大小吗?谢谢! –

+0

@DrBeco在大多数情况下,答案中的缓冲区大小和此答案中提到的显示窗口具有相同的宽度,但这不是必需的。但是,正如您所注意到的,缓冲区和窗口可以并且通常具有不同的高度 - 这是为了回滚Windows控制台会话而提供的功能。我觉得用大缓冲区来考虑是最容易的,它有一个较小的视口(显示)窗口,可以查看主缓冲区的任何部分。 – dgnuff