首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Windows 控制台圖形界面編程(二):控制台窗口信息、標題與緩衝區尺寸控制全攻略

     編輯:關於C語言

控制台窗口不只是黑框框,通過 Windows API 我們可以像操作普通 GUI 窗口一樣查詢/設置標題、調整緩衝區大小、重置窗口位置與尺寸。本文系統梳理 GetConsoleScreenBufferInfo、GetConsoleTitle、SetConsoleTitle、SetConsoleScreenBufferSize、SetConsoleWindowInfo 五大 API,並提供可直接編譯運行的完整演示程式。

核心 API 速查

API功能關鍵結構/參數
GetConsoleScreenBufferInfo獲取緩衝區/窗口尺寸、光標位置、屬性等CONSOLE_SCREEN_BUFFER_INFO
GetConsoleTitle讀取當前窗口標題字符緩衝區、長度
SetConsoleTitle設置窗口標題新標題字符串
SetConsoleScreenBufferSize調整緩衝區字符行列數COORD (寬, 高)
SetConsoleWindowInfo設置窗口在緩衝區中的顯示區域SMALL_RECT, 絕對/相對座標

完整演示程式

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>

#define MAX_TITLE 255

int main(void) {
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO sbInfo;
    COORD newBufSize = {80, 500};   // 緩衝區 80 列 × 500 行(支持大量滾動)
    char title[MAX_TITLE];

    // 1. 讀取並顯示原標題
    GetConsoleScreenBufferInfo(hOut, &sbInfo);
    GetConsoleTitle(title, MAX_TITLE);
    printf("原標題: %s\n", title);
    printf("原緩衝區: %dx%d, 窗口: (%d,%d)-(%d,%d)\n",
           sbInfo.dwSize.X, sbInfo.dwSize.Y,
           sbInfo.srWindow.Left, sbInfo.srWindow.Top,
           sbInfo.srWindow.Right, sbInfo.srWindow.Bottom);
    _getch();

    // 2. 修改標題
    SetConsoleTitle(TEXT("控制台窗口操作演示"));
    GetConsoleTitle(title, MAX_TITLE);
    printf("新標題: %s\n", title);
    _getch();

    // 3. 擴大緩衝區(必須 ≥ 當前窗口尺寸)
    SetConsoleScreenBufferSize(hOut, newBufSize);
    GetConsoleScreenBufferInfo(hOut, &sbInfo);
    printf("新緩衝區高度: %d 行\n", sbInfo.dwSize.Y);
    _getch();

    // 4. 重置窗口大小為 80×25
    SMALL_RECT winRect = {0, 0, 79, 24};
    SetConsoleWindowInfo(hOut, TRUE, &winRect);
    printf("窗口已重置為 80x25。\n");

    CloseHandle(hOut);
    return 0;
}

關鍵約束與避坑指南

  1. 緩衝區 ≥ 窗口:SetConsoleScreenBufferSize 的新尺寸不能小於當前窗口大小,否則調用失敗(返回 FALSE,GetLastError()=ERROR_INVALID_PARAMETER)。
  2. 最小尺寸限制:系統根據當前字體計算最小窗口/緩衝區尺寸,嘗試設更小值會失敗。
  3. Unicode 與 ANSI:GetConsoleTitle/SetConsoleTitle 受 UNICODE 宏影響;MinGW/GCC 下若編碼報錯,可顯式調用 GetConsoleTitleA/SetConsoleTitleA 或統一使用 TCHAR 版本。
  4. 句柄關閉:演示結束前調用 CloseHandle 是良好習慣,雖然進程結束時系統會自動回收。

進階應用場景

  • 日誌查看器:設置大緩衝區(如 5000 行)+ 小窗口,實現類 less 的滾動查看。
  • 多標籤模擬:快速切換 SetConsoleTitle 配合不同緩衝區內容,模擬分頁終端。
  • 自適應佈局:啟動時用 GetConsoleScreenBufferInfo 讀取用戶當前窗口大小,動態調整 UI 佈局。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved