2011-07-25 65 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