我已经编写了一个应用程序来更改显示分辨率。(我曾经以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;
}
编辑2:解决。-问题是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);
}
您会看到分辨率已更改,但在程序完成后又切换回去。
我想将其发布为评论,因为我不知道如何解决它,但是我没有足够的声誉来发表评论。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句