代码只能在Visual Studio Debug中工作,但不能在发布模式和.exe中工作
Code works only in Visual Studio Debug but not in release mode nor .exe
我编写了一个应用程序来更改显示分辨率。(我习惯以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);
}
你会看到分辨率已经改变了,但是当程序结束时又切换回来了。
我想把它作为一个评论,因为我不知道如何修复它,但我还没有足够的声誉来评论。
相关文章:
- 自定义内存管理器在发布模式下工作正常,但在调试模式下则不然
- 装饰器模式在 c++ 中的工作原理
- 我的代码在发布模式下不起作用,而在Qt的调试模式下工作
- 模式匹配函数的时间测量无法正常工作
- ifstream读取二进制文件在发行模式下工作,但在调试模式下不使用
- 打开文件的正确模式是什么,以便 seekp() 的工作方式与在默认模式下打开的文件相同
- 为什么在发布模式下无法访问 for 循环,但在调试中它工作正常
- Python在调试模式下以C 工作,但在EXE文件中不工作
- 该代码在调试模式下工作,但在发布模式C 中不起作用
- 当主GUI线程被阻塞时,如何从工作线程创建无模式对话框
- 如何在 QT 框架工作C++中使用变量作为正则表达式模式
- 在发行模式下开放的软崩溃(调试工作正常)
- 在 C++11 中,lambda 队列是否是工作队列的良好设计模式
- 工作线程队列的这种变体是某种模式或通用结构吗?
- 混合模式程序集(C++/CLI项目)在.NET Core上工作吗
- 在QIODevice::Append模式下打开的QFile意外工作.这是一个Qt错误吗
- 模式功能:它是如何工作的
- zmq呼吸机/工作人员/水槽模式与子流程一起不工作
- 在调试器模式下工作,但在最终版本中不起作用.为什么
- ZeroMq PUB/SUB 模式无法正常工作