我有一个开关视图设置为在两台机器之间切换一台显示器,它似乎从显示器中剥离了一些信息.显示器的原始分辨率为1920×1080 @ 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",MB_ICONHAND); else MessageBoxA(NULL,"Other error",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文件.
从那时起,我做了以下事情:
>使用phoenix.exe工具为我的主监视器生成.dat(工作正常)>在moninfo.exe中加载数据以创建.inf驱动程序文件>使用“Have disk”指定我的新.inf文件>肆无忌惮地忽略了司机未签约的大红色警告(通常不是一件好事)>重新启动并将分辨率切换为正确的分辨率