代码只能在Visual Studio Debug中工作,但不能在发布模式和.exe中工作

Code works only in Visual Studio Debug but not in release mode nor .exe

本文关键字:工作 布模式 模式 exe Visual Studio 代码 Debug 但不能      更新时间:2023-10-16

我编写了一个应用程序来更改显示分辨率。(我习惯以4:3的分辨率玩CS,以16:9的分辨率工作,我懒得去Systemcontrol并在那里更改它。)

只要我在调试模式下使用Visual Studio (Pro 2013)运行该程序就可以正常工作,但如果我更改为发布模式或尝试运行.exe文件,则不工作。

编辑:我没有错误,看起来它确实改变了分辨率(黑色显示器),但它没有改变分辨率。还试图以管理员权限运行。

谁有办法解决我的问题?

提前感谢!

代码:

#include <Windows.h>
struct SResolution
{
    int x;
    int y;
};
static SResolution R_1440x1080 = { 1440, 1080 };
static SResolution R_1920x1080 = { 1920, 1080 };
bool GetPrimaryDisplayDevice(DISPLAY_DEVICE& _rDisplayDevice);
int main()
{
    SResolution Resolution = R_1920x1080; // R_1440x1080 R_1920x1080
    DISPLAY_DEVICE  DDevice;
    DEVMODE         lpDevMode;
    DEVMODE         lpDevMode2;
    ZeroMemory(&DDevice   , sizeof(DDevice));
    ZeroMemory(&lpDevMode , sizeof(lpDevMode));
    ZeroMemory(&lpDevMode2, sizeof(lpDevMode2));
    DDevice.cb        = sizeof(DDevice);
    lpDevMode .dmSize = sizeof(lpDevMode);
    lpDevMode2.dmSize = sizeof(lpDevMode2);
    if (!GetPrimaryDisplayDevice(DDevice)) return 0;
    if (!EnumDisplaySettings(DDevice.DeviceName, ENUM_CURRENT_SETTINGS, &lpDevMode)) return 0;
    // if (Resolution.x == lpDevMode.dmPelsWidth && Resolution.y == lpDevMode.dmPelsHeight) return 0;
    int i = 0;
    while (EnumDisplaySettings(DDevice.DeviceName, i, &lpDevMode))
    {
        if (Resolution.x == lpDevMode.dmPelsWidth && Resolution.y == lpDevMode.dmPelsHeight)
        {
            lpDevMode2 = lpDevMode;
        }
        i++;
    }
    lpDevMode2.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_POSITION | DM_DISPLAYFREQUENCY | DM_DISPLAYFLAGS;
    DWORD Flags = CDS_UPDATEREGISTRY | CDS_FULLSCREEN;
    if (ChangeDisplaySettings(&lpDevMode2, Flags) != DISP_CHANGE_SUCCESSFUL)
    {
        MessageBox(NULL, (LPCWSTR)L"Fail", (LPCWSTR)L"Error", MB_ICONHAND);
    }
    return 0;
}
bool GetPrimaryDisplayDevice(DISPLAY_DEVICE& _rDisplayDevice)
{
    DWORD           NumberOfDevice = 0;
    DWORD           dwFlags = 0;
    while (EnumDisplayDevices(NULL, NumberOfDevice, &_rDisplayDevice, dwFlags))
    {
        DISPLAY_DEVICE InnerDDevice = { 0 };
        DWORD          InnerNumberOfDevice = 0;
        ZeroMemory(&InnerDDevice, sizeof(InnerDDevice));
        InnerDDevice.cb = sizeof(DISPLAY_DEVICE);
        if (_rDisplayDevice.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)
        {
            return true;
        }
        NumberOfDevice++;
    }
    return false;
}

Edit2: 解决。 -问题是CDS_FULLSCREEN标志:

DWORD Flags = CDS_FULLSCREEN | CDS_UPDATEREGISTRY;
ChangeDisplaySettings(&DMode, CDS_UPDATEREGISTRY);

我删除了这个标志,只使用CDS_UPDATEREGISTRY。现在它起作用了。

感谢所有帮助过我或给过我建议的人:)

它确实改变了分辨率。在

后面添加else语句
if (ChangeDisplaySettings(&lpDevMode2, Flags) != DISP_CHANGE_SUCCESSFUL)
{
    MessageBox(NULL, (LPCWSTR)L"Fail", (LPCWSTR)L"Error", MB_ICONHAND);
}
这样的

else 
{
    MessageBox(NULL, (LPCWSTR)L"Success", (LPCWSTR)L"Congrats", MB_ICONHAND);
}

你会看到分辨率已经改变了,但是当程序结束时又切换回来了。

我想把它作为一个评论,因为我不知道如何修复它,但我还没有足够的声誉来评论。