4

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

作为一个快速项目,我尝试查看是否可以使用ChangeDisplaySettingsExwinapi 函数将显示器强制设置为特定的显示设置,但看起来 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)。有什么建议么?我认为用软件解决这个问题会很巧妙。

4

1 回答 1

4

因此,在 SuperUser 上进行搜索为我指明了正确的方向(感谢 Josh)。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.exe 中加载 dat 以创建 .inf 驱动程序文件

  3. 使用“有磁盘”来指定我的新 .inf 文件

  4. 无视司机未签名的大红色警告(一般不是好事)

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

于 2012-08-07T17:07:49.923 回答