web-dev-qa-db-ja.com

Windowsの端末サイズをcで取得しますか?

プレーンcを使用して、Windowsのコンソールウィンドウでymaxとxmaxを確認するにはどうすればよいですか?

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");を使用してコンソールのサイズを確認することもできます。ウィンドウの下に同様の変数はありますか?

PPS。また、両方のシステムで動作すると思われる_ncurses.h_は常に存在しますが、他のライブラリとの競合があるため、回避しています。

PPPS。ここでのこの質問 Cで端末幅を取得しますか? には多くのヒントがあるので、それを繰り返す必要はありません。

19
Dr Beco

(部分回答)

このコード:

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は実際には画面のサイズではありません(ここでは25行ではなく300行)。だが dwSize.X列の番号と一致します。必要なのはwindows.h動作します。

6
Dr Beco

これにより、バッファではなく、コンソールのサイズが出力されます。

#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が実際の値よりも少ないので、1つ追加しました。

26
quantum

以下の2つの関数は、ウィンドウサイズをより直接的に取得します。

Gccを使用して、プログラムがパイプされている場合、このアプローチもGetConsoleScreenBufferInfoも機能しないことがわかったことに注意してください。 for/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;
}
1