使用者按 Alt+Enter 可切換主控台視窗的全螢幕模式。若要在程式中以程式碼控制此行為,Windows 9x 與 NT 核心(NT/2000/XP/後續版本)採用完全不同的機制,且皆涉及未公開的介面。
Win9x 主控台視窗內建快速鍵處理,ID 為 0xE00F。發送 WM_COMMAND 即可觸發切換:
#define ID_SWITCH_CONSOLEMODE 0xE00F
SendMessage(hWndConsole, WM_COMMAND, ID_SWITCH_CONSOLEMODE, 0);
此 ID 未文件化,但廣為人知且相容於所有 Win9x 版本。
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 可能無效。若需相容新舊版本,建議改用視窗最大化模擬全螢幕體驗。