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

程式控制螢幕解析度:EnumDisplaySettings 與 ChangeDisplaySettings 完整指南

     編輯:關於C語言

核心 API

  • EnumDisplaySettings:列舉顯示卡支援的所有模式 (解析度、色深、重新整理率)。
  • ChangeDisplaySettings:切換顯示模式,影響全系統。
  • ChangeDisplaySettingsEx:指定特定顯示裝置 (多螢幕)。

取得目前模式 (比登錄表可靠)


BOOL GetCurrentVideoSettings(DEVMODE* pDevMode) {
    HWND hDesktop = GetDesktopWindow();
    HDC hDC = GetDC(hDesktop);
    pDevMode->dmSize = sizeof(DEVMODE);
    pDevMode->dmBitsPerPel = GetDeviceCaps(hDC, BITSPIXEL);
    pDevMode->dmPelsWidth = GetSystemMetrics(SM_CXSCREEN);
    pDevMode->dmPelsHeight = GetSystemMetrics(SM_CYSCREEN);
    pDevMode->dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
    ReleaseDC(hDesktop, hDC);
    return TRUE;
}

列舉所有支援模式


std::vector modes;
DEVMODE dm = { 0 };
dm.dmSize = sizeof(DEVMODE);
for (int i = 0; EnumDisplaySettings(NULL, i, &dm); ++i) {
    modes.push_back(dm); // 複製結構
    // 可篩選:dm.dmPelsWidth, dm.dmPelsHeight, dm.dmBitsPerPel, dm.dmDisplayFrequency
}

i = ENUM_CURRENT_SETTINGS 取得目前模式,ENUM_REGISTRY_SETTINGS 取得登錄表模式 (重開機生效)。

切換顯示模式


// 從列舉結果中選擇目標模式 dmTarget
LONG result = ChangeDisplaySettings(&dmTarget, CDS_FULLSCREEN | CDS_UPDATEREGISTRY | CDS_NORESET);
// CDS_FULLSCREEN: 全螢幕模式 (遊戲常用),不更新登錄表,登出/重開機自動還原
// CDS_UPDATEREGISTRY: 更新登錄表,永久生效
// CDS_TEST: 僅測試是否支援,不實際切換
// CDS_RESET: 重設為登錄表模式

if (result == DISP_CHANGE_SUCCESSFUL) {
    // 成功,所有視窗收到 WM_DISPLAYCHANGE
} else {
    // 失敗代碼:DISP_CHANGE_BADMODE, DISP_CHANGE_RESTART, DISP_CHANGE_FAILED...
}

DEVMODE 關鍵欄位

多螢幕支援


// 列舉顯示裝置
DISPLAY_DEVICE dd = { 0 };
dd.cb = sizeof(dd);
for (DWORD i = 0; EnumDisplayDevices(NULL, i, &dd, 0); ++i) {
    if (dd.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) {
        // dd.DeviceName 為裝置名 (如 "\\\\.\\DISPLAY1")
        // 使用 EnumDisplaySettings(dd.DeviceName, ...) 列舉該裝置模式
        // 使用 ChangeDisplaySettingsEx(dd.DeviceName, &dm, NULL, flags, NULL) 切換
    }
}

WM_DISPLAYCHANGE 處理

模式切換後,所有視窗收到 WM_DISPLAYCHANGE (wParam = 新色深,lParam = 低字寬度/高字高度)。應用程式應:

  • 重新計算版面配置。
  • 重建相容 DC/位圖 (CreateCompatibleBitmap 需符合新解析度)。
  • DirectX/OpenGL 應用需重置裝置 (IDirect3DDevice9::Reset 等)。

最佳實踐與警示

  • 遊戲/全螢幕應用: 使用 CDS_FULLSCREEN,退出時呼叫 ChangeDisplaySettings(NULL, 0) 還原。
  • 使用者體驗: 切換前彈出確認對話框,提供「保留變更/還原」倒數計時 (如 Windows 顯示設定)。
  • 權限: 非管理員可切換模式,但 CDS_UPDATEREGISTRY 需管理員權限。
  • 相容性: 某些舊版驅動程式不支援特定旗標組合,需測試目標硬體。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
欄位說明
dmPelsWidth / dmPelsHeight解析度寬/高 (像素)
dmBitsPerPel色深:8/16/24/32
dmDisplayFrequency重新整理率 (Hz),0 為預設
dmPosition多螢幕時虛擬桌面座標
dmFields指定哪些欄位有效 (位元旗標組合)