Terminalgröße in c für Windows abrufen?

Lesezeit: 4 Minuten

Benutzer-Avatar
DrBeco

Wie überprüfe ich ymax und xmax in einem Konsolenfenster unter Windows mit einfachem c?

Es gibt diesen Code für 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);
}

Jetzt frage ich mich, wie ich das gleiche für Windows tun kann. Ich habe es versucht winioctl.h aber es definiert nicht struct winsize noch andere mit einem ähnlichen Namen.

Irgendwelche Tipps? Vielen Dank.

PS. Unter Linux können Sie die Konsolengröße auch mit finden getenv("LINES");. Gibt es eine ähnliche Variable unter Windows?

PPS. Außerdem gibt es immer ncurses.hvon dem ich annehme, dass beide Systeme funktionieren, aber ich vermeide es wegen Konflikten mit anderen Bibliotheken, die ich habe.

PPPS. Diese Frage hier Terminalbreite in C bekommen? hat viele Tipps, also keine Notwendigkeit, das zu wiederholen.

Benutzer-Avatar
Quantum

Dies gibt die Größe der Konsole aus, nicht den Puffer:

#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;
}

Dieser Code funktioniert, weil srWindow “enthält die Konsolenbildschirm-Pufferkoordinaten der oberen linken und unteren rechten Ecke des Anzeigefensters”, und die SMALL_RECT Struktur “Spezifizieren Sie die Zeilen und Spalten der Zeichenzellen des Bildschirmpuffers” gemäß MSDN. Ich habe die parallelen Seiten subtrahiert, um die Größe des Konsolenfensters zu erhalten. Seit ich habe 1 weniger als der tatsächliche Wert, habe ich einen hinzugefügt.

  • Ich habe nur wenig Zeit, um es zu testen, aber es sieht so aus, als wäre dies die richtige Antwort auf die Frage. Würden Sie auf den Unterschied zwischen dieser Antwort und der derzeit akzeptierten Antwort hinweisen, die die Puffergröße anzeigt? Vielen Dank!

    – DrBeco

    30. September 2012 um 20:07 Uhr

  • @DrBeco In den meisten Fällen haben die Puffergröße aus Ihrer Antwort und das in dieser Antwort erwähnte Anzeigefenster die gleiche Breite, obwohl dies nicht erforderlich ist. Wie Sie jedoch anmerken, können und haben Puffer und Fenster unterschiedliche Höhen – dies ist es, was die Möglichkeit bietet, eine Windows-Konsolensitzung nach oben zu scrollen. Ich finde es am einfachsten, in Begriffen eines großen Puffers zu denken, mit einem kleineren Ansichtsfenster (Anzeigefenster), das jeden Abschnitt des Hauptpuffers betrachten kann.

    – dgnuff

    18. März 2016 um 21:42 Uhr

  • Genau das, wonach ich gesucht habe. +1

    – Xam

    30. März 2018 um 23:18 Uhr

  • Oder Sie könnten kurz CONSOLE_SCREEN_BUFFER_INFO.dwSize.X und .Y verwenden.

    – RhetorischRuvim

    1. August 2019 um 18:31 Uhr

  • Wenn STDOUT in eine Datei umgeleitet wird, dann wird die GetConsoleScreenBufferInfo() Anruf zurück FALSEdas sollte also getestet werden.

    – Craig McQueen

    29. September 2020 um 5:26 Uhr


(Teilantwort)

Dieser Code:

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);
}

Gibt die Größe des Puffers an. Das einzige Problem ist das dwSize.Y ist nicht wirklich die Größe des Bildschirms (hier 300 statt 25 Zeilen). Aber dwSize.X entspricht der Nummer der Spalte. Nur Bedarf windows.h arbeiten.

Benutzer-Avatar
Leon van Dommelen

Die beiden folgenden Funktionen erhalten die Fenstergröße etwas direkter.

Beachten Sie, dass ich bei Verwendung von gcc festgestellt habe, dass weder dieser Ansatz noch GetConsoleScreenBufferInfo funktioniert, wenn das Programm geleitet wird. Das ist etwas mühsam, da for/f dann auch nicht funktioniert. Anscheinend sind die Bildschirmdaten nicht in einer Pipe verfügbar.

Ähm, die obige Bemerkung ist natürlich enorm dumm. 😉 Es ist STDOUT, das ist nicht der Bildschirm in einer Pipe! Das bedeutet, dass ich lieber STD_ERROR_HANDLE als STD_OUTPUT_HANDLE verwende. Es ist weit weniger wahrscheinlich, dass ich den Standardfehler vom Bildschirm weglenke als die Standardausgabe.

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

  • Da dies ein Ausschnitt ist, füge ich #include und ein main() hinzu, um getww() und getwh() auszugeben. Wenn ich das ausführe, erhalte ich die Größe der verwendeten SCHRIFT – 12×7 – NICHT die Konsolengröße. Mache ich etwas falsch?

    – Kniggeler

    29. April 2021 um 13:31 Uhr

  • +1 für den Vorschlag von STD_ERROR_HANDLE, um den Code von @quantum zum Laufen zu bringen, wenn Sie ihn in einem Skript verwenden oder die Ausgabe anderweitig weiterleiten müssen.

    – Kniggeler

    29. April 2021 um 13:38 Uhr

1371970cookie-checkTerminalgröße in c für Windows abrufen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy