ChangeDisplaySettings成功,但什么都不做。 我如何得到它的工作?

我正在尝试使用ChangeDisplaySettings来更改默认显示设备的桌面分辨率。 但是,当我执行我的function( set_resolution ),ChangeDisplaySettings总是成功,尽pipe没有明显的改变我的桌面分辨率(返回代码总是DISP_CHANGE_SUCCESSFUL)。

我已经尝试了dwFlags的每个值,但是对于每个值我都得到相同的结果。 我已经尝试了多个解决scheme,我的显示器应该支持,但我得到相同的结果。 我的显示是16:9,原生1920×1080。 我试过了,例如,1280×720。

我已经尝试在创build窗口的同时执行set_resolution ,并且我已经尝试在每个WM_ACTIVATE事件上执行该函数。

 LONG set_resolution(uint32_t width, uint32_t height) { DEVMODE dm; dm.dmPelsWidth = width; dm.dmPelsHeight = height; dm.dmBitsPerPel = 32; dm.dmDisplayFrequency = 60; dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY; DWORD flags = 0; //CDS_FULLSCREEN; //CDS_GLOBAL; //CDS_NORESET; //CDS_RESET; //CDS_SET_PRIMARY; //CDS_TEST; //CDS_UPDATEREGISTRY; LONG code = ChangeDisplaySettings(&dm, flags); if (code == DISP_CHANGE_SUCCESSFUL) { printf("Display change successful [%dx%d]: %d", width, height, flags); } else { printf("Display change failed [%dx%d]: %d", width, height, code); } return code; } 

首先将内存清零,然后设置dmSize 。 调用EnumDisplaySettings来初始化其他成员。

在设置不兼容的情况下自动撤消更改是一个好主意,并导致黑屏。

 DEVMODE dm; memset(&dm, 0, sizeof(dm)); dm.dmSize = sizeof(dm); if (0 != EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm)) { int savew = dm.dmPelsWidth; int saveh = dm.dmPelsHeight; dm.dmPelsWidth = width; dm.dmPelsHeight = height; LONG result = ChangeDisplaySettings(&dm, 0); if (result == DISP_CHANGE_SUCCESSFUL) { printf("okay\n"); //Add a dialog to ask the user to confirm. //The dialog should close automatically if user is unable to confirm //if (confirm()) return; Sleep(5000); dm.dmPelsWidth = savew; dm.dmPelsHeight = saveh; ChangeDisplaySettings(&dm, 0); } else { printf("error\n"); } } 

编辑,修正错字。 我打算说调用EnumDisplaySettings来初始化DEVMODE的成员