控制台窗口不只是黑框框,通過 Windows API 我們可以像操作普通 GUI 窗口一樣查詢/設置標題、調整緩衝區大小、重置窗口位置與尺寸。本文系統梳理 GetConsoleScreenBufferInfo、GetConsoleTitle、SetConsoleTitle、SetConsoleScreenBufferSize、SetConsoleWindowInfo 五大 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;
}
SetConsoleScreenBufferSize 的新尺寸不能小於當前窗口大小,否則調用失敗(返回 FALSE,GetLastError()=ERROR_INVALID_PARAMETER)。GetConsoleTitle/SetConsoleTitle 受 UNICODE 宏影響;MinGW/GCC 下若編碼報錯,可顯式調用 GetConsoleTitleA/SetConsoleTitleA 或統一使用 TCHAR 版本。CloseHandle 是良好習慣,雖然進程結束時系統會自動回收。less 的滾動查看。SetConsoleTitle 配合不同緩衝區內容,模擬分頁終端。GetConsoleScreenBufferInfo 讀取用戶當前窗口大小,動態調整 UI 佈局。