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

C語言控制台窗口界面編程入門:標準句柄獲取與基礎概念

     編輯:關於C語言

前言:控制台 GUI 開發的起點

在 Windows 下用 C 語言開發控制台窗口界面 (TUI),第一步就是獲取標準輸入、輸出、錯誤設備的句柄。所有後續的顏色設置、光標控制、字符繪製、輸入事件讀取,都建立在這三個句柄之上。本系列改編自《C語言控制台窗口界面編程(修正版)》,去繁就簡,聚焦核心實用技術。

一、 核心 API:GetStdHandle

HANDLE GetStdHandle(DWORD nStdHandle);

參數 nStdHandle 三大標準設備常量:

常量值用途
STD_INPUT_HANDLE-10標準輸入 (鍵盤/重定向輸入)
STD_OUTPUT_HANDLE-11標準輸出 (控制台顯示/重定向輸出)
STD_ERROR_HANDLE-12標準錯誤 (錯誤信息輸出,可單獨重定向)

二、 典型初始化代碼

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

HANDLE hStdin, hStdout, hStderr;

int main() {
    // 1. 獲取三大標準句柄
    hStdin  = GetStdHandle(STD_INPUT_HANDLE);
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    hStderr = GetStdHandle(STD_ERROR_HANDLE);

    if (hStdin == INVALID_HANDLE_VALUE ||
        hStdout == INVALID_HANDLE_VALUE ||
        hStderr == INVALID_HANDLE_VALUE) {
        fprintf(stderr, "獲取標準句柄失敗, 錯誤碼: %lu\n", GetLastError());
        return 1;
    }

    // 2. 後續所有控制台操作都基於這些句柄
    // 例如:設置標題、顏色、光標位置、讀取輸入事件...
    SetConsoleTitle(TEXT("My Console GUI"));
    
    return 0;
}

三、 句柄的本質與後續用途

  • 本質:內核對象引用,不透明值,不可直接運算,只能傳遞給 API。
  • 輸出句柄:WriteConsole, SetConsoleTextAttribute, SetConsoleCursorPosition, FillConsoleOutputCharacter 等繪圖/顏色/光標 API 都需它。
  • 輸入句柄:ReadConsoleInput 讀取鍵盤/鼠標/窗口事件,SetConsoleMode 啟用 ENABLE_MOUSE_INPUT 等模式。
  • 錯誤句柄:日誌/診斷輸出,可獨立重定向到文件而不干擾正常輸出管道。

四、 常見誤區避坑

  1. 不要用 stdin/stdout/stderr (FILE*) 混淆:C Runtime 的流指針有緩衝,Win32 句柄無緩衝直接對話內核,兩套體系不可混用 (除非 _get_osfhandle 轉換)。
  2. 檢查返回值:重定向、管道、服務模式下標準句柄可能無效,必須判 INVALID_HANDLE_VALUE。
  3. 權限:寫入輸出句柄需 GENERIC_WRITE,讀取輸入句柄需 GENERIC_READ,通常默認滿足。

五、 總結與下一步

拿到三大句柄,就是拿到了控制台的「遙控器」。下一篇將講解 SetConsoleMode 啟用鼠標/窗口/擴展輸入模式,以及 ReadConsoleInput 事件循環架構,開啟真正的交互式 TUI 開發之旅。

系列導航:

  • 第 1 篇:標準句柄獲取 (本文)
  • 第 2 篇:控制台模式設置與事件循環
  • 第 3 篇:光標控制與字符繪製
  • 第 4 篇:顏色與屬性設置
  • 第 8 篇:鼠標事件處理 (已發布)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved