代码仅在Visual Studio调试中有效,而在发布模式或.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;
}

编辑2:解决。-问题是CDS_FULLSCREEN标志位于:

DWORD Flags = CDS_FULLSCREEN | CDS_UPDATEREGISTRY;

ChangeDisplaySettings(&DMode, CDS_UPDATEREGISTRY);

我已删除此标志,仅使用CDS_UPDATEREGISTRY。现在可以了。

感谢所有帮助我或给我提示的人:)

基里尔·戴博夫(Kirill Daybov)

实际上,它确实会改变分辨率。在此之后添加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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

带图像的GhostScript PS to PDF仅在Visual Studio中的调试模式下有效

jQuery代码仅在浏览器的编辑器中有效,而在脚本标记中则无效

“ ${foo//@(...)/}”仅在命令行中有效,而在脚本中无效

为什么代码在通用类中有效而在非通用类中无效?

调试编辑后,Visual Studio将有效代码错误视为无效代码

FCM-推送通知仅在控制台中有效,而在邮递员中无效

咕serve服务-实时重新加载仅在app / *。html中有效,而在app / views / *。html中无效

函数在调试器中有效,但在实时代码中无效

为什么此Spark代码在本地模式下有效,而在集群模式下无效?

在C#Visual Studio中,仅调试模式有效。不能在标准的“不调试运行”中运行

为什么此 JavaScript css 过滤器代码在 Firefox 中有效,而在 Chrome 中无效?

C# 代码在 Visual Studio 2019 中有效,但在在线编译器中无效

更新集命令在 Access 中有效,但在带有 @parameters 的 Visual Studio 中无效

如何在 Visual Studio 2017 中有效调试?

Scrapy 在 shell 中有效,但在代码中无效

代码在终端中有效,但在脚本中无效

Snippet Designer中的Visual Studio代码段均无法导入

VBA代码仅在调试模式下有效

Excel VBA代码仅在调试模式下有效

为什么HTML复选框功能仅在IE中有效,而在Firefox或Chrome中不起作用?

字典在迭代过程中更改了大小-代码在Py2中有效,而在Py3中无效

由于某种原因,我的split()在我的代码的一行中有效,而在另一行中则无效

xml属性在xml中不起作用,仅在代码中有效

仅在Firefox中有效的代码

代码仅在jsfiddle中有效

在Visual Studio中调试exe代码

设置访问权限在调试模式下有效,但在发布模式下无效

Visual Studio代码仅在unittest模块中运行第一个测试功能

代码在Firefox Scratchpad中有效,但在代码中无效