在视窗/C++中强制显示分辨率

Force display resolution in Windows / C++

本文关键字:显示 分辨率 C++      更新时间:2023-10-16

我设置了一个切换视图,可以在两台机器之间切换一台显示器,它似乎正在从显示器上剥离一些信息。显示器的原始分辨率是1920x1080@60hz但Windows拒绝让我将其设置为高于25hz隔行扫描的任何值,这看起来绝对可怕。我已经尝试了广泛的谷歌搜索建议的所有驱动程序和设置,但仍然一无所获。

作为一个快速项目,我试图看看是否可以使用 ChangeDisplaySettingsEx winapi 函数强制显示器到特定的显示设置,但看起来 Windows 仍在检查以确保该模式处于不正确的一组支持的模式并返回 DISP_CHANGE_BADMODE .

这是完整的功能:

WCHAR deviceName[64];
DISPLAY_DEVICE dd;  
dd.cb = sizeof(DISPLAY_DEVICE);
int index=0;
while (EnumDisplayDevices(NULL, index++, &dd, 0))
{
    // first monitor is the problem one
    if (index == 1) {
        lstrcpy(deviceName, dd.DeviceName);
    }
}
DEVMODE dmScreenSettings;
ZeroMemory(&dmScreenSettings, sizeof(DEVMODE));
dmScreenSettings.dmSize             = sizeof(DEVMODE);
dmScreenSettings.dmPelsWidth        = 1920;
dmScreenSettings.dmPelsHeight       = 1080;
dmScreenSettings.dmBitsPerPel       = 32;
dmScreenSettings.dmDisplayFrequency = 60;
dmScreenSettings.dmFields           = DM_DISPLAYFREQUENCY | DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
LONG res = ChangeDisplaySettingsExW((LPCWSTR) &deviceName, &dmScreenSettings, NULL, CDS_RESET, NULL);
if (res != DISP_CHANGE_SUCCESSFUL)
{
    if (res == DISP_CHANGE_BADMODE)
        MessageBoxA(NULL, "Bad mode", "Failed", MB_ICONHAND);
    else if (res == DISP_CHANGE_BADPARAM)
        MessageBoxA(NULL, "Bad Param", "Failed", MB_ICONHAND);
    else
        MessageBoxA(NULL, "Other error", "Failed", MB_ICONHAND);
}

我已经看过如何强制任何我想要的显示分辨率/时序? 如果可能的话,我宁愿不走使用 ATI SDK(我有一个 ATI Radeon)的道路。有什么建议吗?我认为用软件解决这个问题会很整洁。

因此,在超级用户上进行搜索为我指明了正确的方向(感谢乔希)。switchview 没有正确传递 EDID 数据,Windows Vista/7 坚持在所有情况下都可用时使用 EDID 数据。有一些关于移除两个EDID引脚的信息,但我不想走这条路。

做一些谷歌搜索让我找到了 http://msdn.microsoft.com/en-us/windows/hardware/gg487330.aspx 其中有一篇关于覆盖你的EDID的白皮书。这反过来又让我想到了一个论坛主题:http://www.sevenforums.com/tutorials/7947-force-dvi-hdmi-resolutions-refresh-rates.html。那里有人很好,可以创建一个工具来轻松生成EDID覆盖.dat文件。

从那时起,我做了以下工作:

  1. 使用phoenix.exe工具为我的主显示器生成.dat(工作正常)

  2. 在 moninfo 中加载了 dat .exe以创建一个 .inf 驱动程序文件

  3. 使用"从磁盘安装"来指定我的新 .inf 文件

  4. 明目张胆地无视司机未签名的大红色警告(一般不是一件好事)

  5. 已重新启动并将分辨率切换到正确的分辨率