Question

Comment vérifier ymax et Xmax dans une fenêtre de la console, sous Windows, en utilisant c simple?

Il y a ce morceau de code pour 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);
}

Maintenant, je me demande comment je peux faire la même chose pour les fenêtres. J'ai essayé winioctl.h mais il ne définit pas struct winsize ni aucun autre avec un nom similaire.

Des conseils? Merci.

PS. Sous Linux, vous pouvez également trouver la taille de la console à l'aide getenv("LINES");. Y at-il une variable similaire sous Windows?

PPS. De plus, il y a toujours ncurses.h, que je suppose que les deux systèmes fonctionnent, mais je l'éviter en raison de conflits avec d'autres bibliothèques que j'ai.

PPPS. Cette question ici Obtenir la largeur du terminal en C? a beaucoup de conseils, donc pas besoin à répéter.

Était-ce utile?

La solution 2

(réponse partielle)

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

donne la taille de la mémoire tampon. Le seul problème est que dwSize.Y est pas vraiment la taille de l'écran (300 ici au lieu de 25 lignes). Mais dwSize.X correspond au numéro de la colonne. Besoins seulement windows.h au travail.

Autres conseils

Cette impression de la taille de la console, et non la mémoire tampon:

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

Ce code fonctionne parce que srWindow « contient les coordonnées de la mémoire tampon d'écran de la console des coins supérieur gauche et inférieur droit de la fenêtre d'affichage », et la structure de SMALL_RECT « spécifier les lignes et les colonnes de cellules de caractères écran-tampon » selon la MSDN. Je soustrait les côtés parallèles pour obtenir la taille de la fenêtre de la console. Depuis que je suis 1 inférieure à la valeur réelle, j'ai ajouté un.

Le dessous de deux fonctions sera la taille de la fenêtre un peu plus directement.

Notez que j'ai trouvé, en utilisant gcc, que ni cette approche ne fonctionne GetConsoleScreenBufferInfo si le programme est canalisé. C'est un peu d'une douleur que pour / f ne fonctionne pas alors non plus. Apparemment, les données de l'écran ne sont pas disponibles dans un tuyau.

Um, la remarque ci-dessus est bien sûr énormément stupide. ;) Il est STDOUT qui n'est pas l'écran dans un tuyau! Cela ne signifie que je préfère utiliser STD_ERROR_HANDLE ci-dessus STD_OUTPUT_HANDLE. Je suis beaucoup moins susceptibles de diriger erreur standard loin de l'écran de sortie standard.

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top