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

C/C++ 控制台全屏顯示實現:Windows API 方案完整解析

     編輯:關於C語言

讓控制台「黑框框」真正全屏運行

C/C++ 初學者常苦惱於控制台窗口過小,無法完整顯示大量數據或模擬全屏界面。本文提供一個基於 Windows API 的 FullScreen() 函數,在 main() 首行調用即可實現控制台最大化佔滿屏幕,附完整參數解析與原理說明。

核心代碼實現

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

void FullScreen() {
    HWND hwnd = GetForegroundWindow();           // 1. 獲取當前控制台窗口句柄
    int x = GetSystemMetrics(SM_CXSCREEN) + 300; // 2. 獲取屏幕寬度 + 緩衝
    int y = GetSystemMetrics(SM_CYSCREEN) + 300; //    獲取屏幕高度 + 緩衝
    char setting[30];
    sprintf(setting, "mode con:cols=%d lines=%d", x, y); // 3. 構造模式命令
    system(setting);                             // 4. 設置控制台緩衝區大小
    SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, x+300, y+300, NULL); // 5. 置頂並調整窗口
    MoveWindow(hwnd, -10, -40, x+300, y+300, TRUE);             // 6. 精確定位覆蓋任務欄
    printf("\n\n");                              // 7. 預留標題欄空間
}

int main() {
    FullScreen(); // 主函數第一行調用
    // 你的業務代碼...
    printf("全屏控制台就緒!\n");
    system("pause");
    return 0;
}

關鍵 API 逐行解析

API作用關鍵參數說明
GetForegroundWindow()獲取當前活動窗口句柄此處即控制台窗口 HWND
GetSystemMetrics(SM_CXSCREEN)獲取主顯示器寬度(像素)配合 SM_CYSCREEN 取高度
sprintf(setting, "mode con:cols=%d lines=%d", x, y)格式化字符串構造命令mode con 設置控制台列數/行數(字符單位)
system(setting)執行命令調整緩衝區實際改變控制台內部字符網格大小
SetWindowPos(..., HWND_TOPMOST, ...)設置窗口 Z 序為最頂層防止被其他窗口遮擋
MoveWindow(hwnd, -10, -40, w, h, TRUE)精確移動並調整窗口大小負坐標抵消窗口邊框/標題欄,實現真全屏覆蓋

為什麼需要 +300 和負座標?

  • cols/lines 單位是字符,而 GetSystemMetrics 返回像素。粗略換算:字符寬≈8px,高≈16px。+300 確保緩衝區足夠大
  • MoveWindow 負偏移:將窗口左上角移出屏幕可見區 (-10, -40),配合加大尺寸 (w+300, h+300),實現客戶區精確鋪滿全屏,隱藏標題欄與邊框
  • HWND_TOPMOST 確保控制台始終置頂,不被彈窗遮擋

適用場景與限制

✅ 適用場景

  • 教學演示、學生管理系統等課程設計全屏界面
  • 大量數據輸出需完整可見(日志、報表、矩陣)
  • 簡易文本遊戲、終端 UI 原型

⚠️ 限制與注意

  • 僅限 Windows:依賴 windows.h,跨平台需條件編譯
  • DPI 縮放影響:高 DPI 系統下像素/字符換算可能偏差
  • 多顯示器:SM_CXSCREEN 僅取主屏,跨屏場景需 GetMonitorInfo
  • 現代替代方案:新專案建議考慮 虛擬終端序列 或 Windows Terminal 兼容模式

進階優化建議

// 更健壯的版本:錯誤檢查 + DPI 感知
void FullScreenRobust() {
    HWND hwnd = GetConsoleWindow(); // 專門獲取控制台窗口,比 GetForegroundWindow 可靠
    if (!hwnd) return;
    
    // 啟用 DPI 感知 (Win10 1607+)
    SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
    
    HMONITOR monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
    MONITORINFOEX mi = { sizeof(mi) };
    GetMonitorInfo(monitor, &mi);
    
    int width = mi.rcMonitor.right - mi.rcMonitor.left;
    int height = mi.rcMonitor.bottom - mi.rcMonitor.top;
    
    // 字符單位換算 (假設 8x16 字體)
    int cols = width / 8 + 10;
    int lines = height / 16 + 5;
    
    char cmd[64];
    sprintf(cmd, "mode con:cols=%d lines=%d", cols, lines);
    system(cmd);
    
    MoveWindow(hwnd, mi.rcMonitor.left, mi.rcMonitor.top, width, height, TRUE);
}

這個 FullScreen() 方案雖屬「黑科技」,但對於快速原型、教學演示、舊系統維護極其實用。理解其背後的 Windows 窗口管理與控制台機制,能幫助你在受限環境下創造更好的用戶體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved