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 關鍵欄位| 欄位 | 說明 |
|---|---|
| dmPelsWidth / dmPelsHeight | 解析度寬/高 (像素) |
| dmBitsPerPel | 色深:8/16/24/32 |
| dmDisplayFrequency | 重新整理率 (Hz),0 為預設 |
| dmPosition | 多螢幕時虛擬桌面座標 |
| dmFields | 指定哪些欄位有效 (位元旗標組合) |