我将其中一个切换视图设置为在两台机器之间切换一个监视器,它似乎正在从监视器中剥离一些信息。显示器的原始分辨率为 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)。有什么建议么?我认为用软件解决这个问题会很巧妙。