[英]ChangeDisplaySettings succeeds yet does nothing. How do I get it to work?
我正在嘗試使用ChangeDisplaySettings更改默認顯示設備的桌面分辨率。 但是,當我執行函數( set_resolution
)時,盡管對我的桌面分辨率沒有明顯的更改,ChangeDisplaySettings總是成功(返回代碼始終是DISP_CHANGE_SUCCESSFUL)。
我已經嘗試了dwFlags的每個值,但是對於每個值我都得到了相同的結果。 我嘗試了顯示器應支持的多種分辨率,但得到的結果相同。 我的顯示是16:9,原生1920x1080。 我已經嘗試過,例如1280x720。
我嘗試在創建窗口的同時執行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
的成員
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.