2016-08-19 11 views
4

ChangeDisplaySettingsを使用して、デフォルトのディスプレイデバイスのデスクトップ解像度を変更しようとしています。しかし、私の機能(set_resolution)を実行すると、ChangeDisplaySettingsはデスクトップ解像度に明らかな変更を加えなくても成功します(リターンコードは常にDISP_CHANGE_SUCCESSFULです)。ChangeDisplaySettingsは成功しますが、何もしません。どうすればそれを動作させることができますか?

私はdwFlagsのすべての値を試しましたが、それぞれの値に対して同じ結果が得られます。ディスプレイがサポートすべき複数の解像度を試しましたが、同じ結果が得られます。私のディスプレイは16:9、ネイティブ1920x1080です。私は1280x720のように試しました。

私はウィンドウを作成すると同時にset_resolutionを実行しようとしましたが、すべてのWM_ACTIVATEイベントで関数を実行しようとしました。

LONG set_resolution(uint32_t width, uint32_t height) 
{ 
    DEVMODE dm; 

    dm.dmPelsWidth = width; 
    dm.dmPelsHeight = height; 
    dm.dmBitsPerPel = 32; 
    dm.dmDisplayFrequency = 60; 
    dm.dmFields = 
     DM_PELSWIDTH | 
     DM_PELSHEIGHT | 
     DM_BITSPERPEL | 
     DM_DISPLAYFREQUENCY; 

    DWORD flags = 
     0; 
     //CDS_FULLSCREEN; 
     //CDS_GLOBAL; 
     //CDS_NORESET; 
     //CDS_RESET; 
     //CDS_SET_PRIMARY; 
     //CDS_TEST; 
     //CDS_UPDATEREGISTRY; 

    LONG code = ChangeDisplaySettings(&dm, flags); 

    if (code == DISP_CHANGE_SUCCESSFUL) 
    { 
     printf("Display change successful [%dx%d]: %d", width, height, flags); 
    } 
    else 
    { 
     printf("Display change failed [%dx%d]: %d", width, height, code); 
    } 

    return code; 
} 
+2

と呼びます。あなたは 'dm.dmSize'を設定していません。不確かな場合は、[documentation](https://msdn.microsoft.com/en-us/library/windows/desktop/dd183411(v = vs.85).aspx)を参照してください。DEVMODEのdmSizeメンバを初期化する必要がありますDEVMODE構造体のサイズ(バイト単位)。 DEVMODEのdmDriverExtraメンバは、DEVMODE構造体に続くプライベートドライバデータのバイト数を示すように初期化する必要があります。 –

答えて

2

メモリをゼロにしてから、dmSizeと設定します。 EnumDisplaySettingsに電話して、他のメンバーを初期化します。

DEVMODE dm; 
memset(&dm, 0, sizeof(dm)); 
dm.dmSize = sizeof(dm); 

if (0 != EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm)) 
{ 
    int savew = dm.dmPelsWidth; 
    int saveh = dm.dmPelsHeight; 
    dm.dmPelsWidth = width; 
    dm.dmPelsHeight = height; 

    LONG result = ChangeDisplaySettings(&dm, 0); 
    if (result == DISP_CHANGE_SUCCESSFUL) 
    { 
     printf("okay\n"); 

     //Add a dialog to ask the user to confirm. 
     //The dialog should close automatically if user is unable to confirm 
     //if (confirm()) return; 
     Sleep(5000); 

     dm.dmPelsWidth = savew; 
     dm.dmPelsHeight = saveh; 
     ChangeDisplaySettings(&dm, 0); 
    } 
    else 
    { 
     printf("error\n"); 
    } 
} 

編集、固定タイプミス...設定は互換性がなかったと黒い画面が生じた場合には、自動的に変更を元に戻すためのルーチンを持って良いでしょう。私はEnumDisplaySettingsを呼び出すとDEVMODEのメンバーを

+0

設定を復元するコードを 'DISP_CHANGE_SUCCESSFUL'ブランチに入れました。これは意図されていますか?私はまた、エラーの場合に設定を復元することが賢明である理由を理解していません。 API呼び出しが失敗した場合、元に戻す変更はありません。 – IInspectable

+0

私はそれが「これはあなたによく見えますか?ユーザーが気に入らない、または機能しない場合に、ユーザーの心を変えさせる。 –

+0

@IInspectable標準のWindowsディスプレイ設定では、ユーザーが「はい、新しい設定を保存します」と表示されない場合、変更を元に戻すルーチンが使用されます。私は変更を自動的に元に戻す簡単なものを書きました。さもなければ、誰かがこのコードを実行し、それらは黒い画面で終わるかもしれません、そして、彼らは変更を元に戻す方法がありません。 –

関連する問題