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

控制台程式全螢幕模式切換:Win9x 與 NT 核心的不同做法

     編輯:VC 教學

使用者按 Alt+Enter 可切換主控台視窗的全螢幕模式。若要在程式中以程式碼控制此行為,Windows 9x 與 NT 核心(NT/2000/XP/後續版本)採用完全不同的機制,且皆涉及未公開的介面。

Windows 9x:模擬快速鍵訊息

Win9x 主控台視窗內建快速鍵處理,ID 為 0xE00F。發送 WM_COMMAND 即可觸發切換:

#define ID_SWITCH_CONSOLEMODE 0xE00F
SendMessage(hWndConsole, WM_COMMAND, ID_SWITCH_CONSOLEMODE, 0);

此 ID 未文件化,但廣為人知且相容於所有 Win9x 版本。

Windows NT 核心:未公開 API SetConsoleDisplayMode

NT 核心不處理該快速鍵,改提供兩個未匯出的 Kernel32 函數:

BOOL WINAPI SetConsoleDisplayMode(HANDLE hOut, DWORD dwNewMode, LPDWORD lpdwOldMode);
BOOL WINAPI GetConsoleDisplayMode(LPDWORD lpdwMode);
  • hOut:GetStdHandle(STD_OUTPUT_HANDLE) 取得。
  • dwNewMode:1 = 全螢幕,0 = 視窗模式。
  • lpdwOldMode:接收先前模式。

因未在 Kernel32.lib 匯出,必須動態載入:

typedef BOOL (WINAPI *PFN_SetConsoleDisplayMode)(HANDLE, DWORD, LPDWORD);
typedef BOOL (WINAPI *PFN_GetConsoleDisplayMode)(LPDWORD);

HMODULE hKernel = GetModuleHandle("kernel32");
auto SetConsoleDisplayMode = (PFN_SetConsoleDisplayMode)GetProcAddress(hKernel, "SetConsoleDisplayMode");
auto GetConsoleDisplayMode = (PFN_GetConsoleDisplayMode)GetProcAddress(hKernel, "GetConsoleDisplayMode");

if (SetConsoleDisplayMode) {
    DWORD oldMode;
    SetConsoleDisplayMode(GetStdHandle(STD_OUTPUT_HANDLE), 1, &oldMode); // 進入全螢幕
}

跨平台封裝建議

void ToggleConsoleFullscreen(bool bFullscreen) {
    #if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0500) // NT 核心
        // 動態載入 SetConsoleDisplayMode...
    #else // Win9x
        HWND hCon = GetConsoleWindow(); // 需 Win2000+ 才有此 API,純 9x 需 FindWindow("tty", ...)
        SendMessage(hCon, WM_COMMAND, 0xE00F, 0);
    #endif
}

注意: 現代 Windows (Vista+) 主控台架構大幅重寫,全螢幕模式已移除(改為最大化視窗),上述方法在新版 Windows 可能無效。若需相容新舊版本,建議改用視窗最大化模擬全螢幕體驗。

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