透過 Windows API EnumDisplaySettings 取得目前顯示設定,修改寬高後呼叫 ChangeDisplaySettings 套用,實現執行期動態切換解析度。
void __fastcall TForm1::btnGetClick(TObject *Sender) {
int x = GetSystemMetrics(SM_CXSCREEN);
int y = GetSystemMetrics(SM_CYSCREEN);
ShowMessage("螢幕水平解析度: " + IntToStr(x) +
"\n\n螢幕垂直解析度: " + IntToStr(y));
}
void __fastcall TForm1::DynamicResolution(int x, int y) {
DEVMODE dm; // TDeviceMode 在 BCB 中對應 DEVMODE
ZeroMemory(&dm, sizeof(dm));
dm.dmSize = sizeof(dm);
// 取得目前顯示設定 (ENUM_CURRENT_SETTINGS = -1)
if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm)) {
dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;
dm.dmPelsWidth = x;
dm.dmPelsHeight = y;
// 套用變更,0 表示立即生效
LONG result = ChangeDisplaySettings(&dm, 0);
if (result == DISP_CHANGE_SUCCESSFUL) {
ShowMessage("解析度切換成功");
} else {
ShowMessage("切換失敗,錯誤碼: " + IntToStr(result));
}
} else {
ShowMessage("無法取得顯示設定");
}
}
void __fastcall TForm1::BitBtn1Click(TObject *Sender) {
DynamicResolution(800, 600); // 切換至 800x600
}
void __fastcall TForm1::BitBtn2Click(TObject *Sender) {
DynamicResolution(1024, 768); // 切換至 1024x768
}
| 項目 | 說明 |
|---|---|
| DEVMODE (TDeviceMode) | 裝置模式結構,包含解析度、色深、重新整理率等 |
| dmFields | 指定哪些欄位有效 (DM_PELSWIDTH, DM_PELSHEIGHT, DM_BITSPERPEL, DM_DISPLAYFREQUENCY 等) |
| EnumDisplaySettings | NULL 裝置名 = 目前顯示裝置;ENUM_CURRENT_SETTINGS (-1) = 目前模式 |
| ChangeDisplaySettings 回傳值 | DISP_CHANGE_SUCCESSFUL (0) 成功;其他如 DISP_CHANGE_RESTART (1) 需重啟、DISP_CHANGE_FAILED (-1) 失敗等 |