gpt4 book ai didi

c++ - 代码仅适用于 Visual Studio 调试,但不适用于 Release模式或 .exe

转载 作者:搜寻专家 更新时间:2023-10-31 02:15:07 25 4
gpt4 key购买 nike

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

只要我在 Debug模式下使用 Visual Studio (Pro 2013) 运行该程序,该程序就可以正常运行,但如果我更改为 Release模式或尝试运行 .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);
}

您会看到分辨率发生了变化,但在程序结束时又切换回来了。

我想将它作为评论发布,因为我不知道如何修复它,但我还没有足够的声誉来发表评论。

关于c++ - 代码仅适用于 Visual Studio 调试,但不适用于 Release模式或 .exe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39063955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com