4

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 を持っています) を使用する道をたどりたくありません。助言がありますか?これをソフトウェアで解決するのはかなりいいと思います。

4

1 に答える 1

4

したがって、SuperUserで検索を行うと、正しい方向が示されました(Joshに感謝します)。スイッチビューはEDIDデータを適切に渡しておらず、Windows Vista / 7は、すべての場合に利用可能な場合にEDIDデータを使用することに固執しています。2つのEDIDピンを削除することについていくつかの情報がありましたが、私はその道を進みたくありませんでした。

グーグルを実行すると、EDIDのオーバーライドに関するホワイトペーパーが掲載されているhttp://msdn.microsoft.com/en-us/windows/hardware/gg487330.aspxに移動しました。それが今度は私をここのフォーラムスレッドに導きました:http ://www.sevenforums.com/tutorials/7947-force-dvi-hdmi-resolutions-refresh-rates.html 。EDIDオーバーライド.datファイルを簡単に生成するためのツールを作成するのに十分な人がいました。

その時点から、私は次のことを行いました。

  1. phoenix.exeツールを使用して、メインモニター(正常に動作している)の.datを生成しました

  2. .infドライバーファイルを作成するためにmoninfo.exeにデータをロードしました

  3. 「Havedisk」を使用して新しい.infファイルを指定しました

  4. ドライバーが署名されていないという大きな赤い警告を大胆に無視しました(一般的には良いことではありません)

  5. 再起動し、解像度を適切なものに切り替えました

于 2012-08-07T17:07:49.923 に答える