Pregunta

¿Cómo verificar YMAX y XMAX en una ventana de consola, debajo de las ventanas, usando C Plain C?

Existe este código para 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);
}

Ahora me pregunto cómo puedo hacer lo mismo para Windows. Lo intenté winioctl.h Pero no define struct winsize ni ningún otro con un nombre similar.

¿Algun consejo? Gracias.

PD. En Linux también puede encontrar el tamaño de la consola usando getenv("LINES");. ¿Hay una variable similar en Windows?

Pps. Además, siempre hay ncurses.h, que supongo que trabajo ambos sistemas, pero lo estoy evitando debido a los conflictos con otras bibliotecas que tengo.

PPPS. Esta pregunta aquí ¿Obtener ancho terminal en c? Tiene muchos consejos, por lo que no es necesario repetir eso.

¿Fue útil?

Solución 2

(Respuesta parcial)

Este código:

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

Da el tamaño del búfer. El único problema es que dwSize.Y No es realmente el tamaño de la pantalla (300 aquí en lugar de 25 líneas). Pero dwSize.X coincide con el número de la columna. Solo necesita windows.h trabajar.

Otros consejos

Esto imprime el tamaño de la consola, no el búfer:

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

Este código funciona porque srWindow "Contiene las coordenadas del búfer de pantalla de la consola de las esquinas de la izquierda superior y la baja de la ventana de la pantalla", y el SMALL_RECT Estructura "Especifique las filas y columnas de las celdas de caracteres del buffer de pantalla" de acuerdo con MSDN. Resté los lados paralelos para obtener el tamaño de la ventana de la consola. Desde que tengo 1 Menos que el valor real, agregué uno.

Las siguientes dos funciones obtendrán el tamaño de la ventana algo más directamente.

Tenga en cuenta que encontré, usando GCC, que ni este enfoque ni getConsolescreenBufferInfo funciona si el programa está conectado. Eso es algo así como un dolor, ya que tampoco funciona. Aparentemente, los datos de la pantalla no están disponibles en una tubería.

Um, el comentario anterior es, por supuesto, enormemente estúpido. ;) ¡Es stdout que no es la pantalla en una tubería! Eso significa que prefiero usar std_error_handle arriba std_output_handle. Tengo mucho menos probabilidades de dirigir el error estándar lejos de la pantalla que la salida estándar.

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top