2台のマシン間で1台のモニターを切り替えるように設定されたスイッチビューの1つがありますが、モニターから情報の一部が取り除かれているようです。モニターのネイティブ解像度は 1920x1080@60hz ですが、Windows は 25hz インターレースより高い解像度に設定することを拒否しています。広範なGoogle検索で提案されたすべてのドライバーと設定を試しましたが、まだ何もしていません。
簡単なプロジェクトとして、winapi関数を使用してモニターを特定のディスプレイ設定に強制できるかどうかを確認しようとしましたChangeDisplaySettingsEx
が、モードがサポートされているモードの間違ったセットにあることを確認するためにウィンドウがまだチェックしているように見えます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 を持っています) を使用する道をたどりたくありません。助言がありますか?これをソフトウェアで解決するのはかなりいいと思います。