我设置了其中一个切换 View ,以在两台计算机之间切换一台监视器,这似乎正在从监视器中剥离一些信息。显示器的原始分辨率为1920x1080 @ 60hz,但Windows拒绝让我将其设置为高于25hz隔行扫描的任何值,这看起来绝对可怕。我已经尝试了广泛的Google搜索建议的所有驱动程序和设置,但还是一无所获。
作为一个快速的项目,我试图查看是否可以使用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);
}
我已经看过How can I force any display resolution/timing I want?,并且尽可能不要使用ATI SDK(我有ATI Radeon)。有什么建议?我认为用软件解决这一问题会很巧妙。
最佳答案
因此,在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文件的工具。
从那时起,我做了以下事情: