簡體   English   中英

ChangeDisplaySettings成功,但不執行任何操作。 我如何使它工作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM