2016-08-21 10 views
2

表示解像度を変更するアプリケーションを作成しました。 (私は4:3の解像度で16:9の解像度で再生していましたが、SystemControlに行ってそこに変更するのは面倒です。)コードはVisual Studio Debugのみで動作しますが、リリースモードや.exeでは動作しません。

プログラムは、 Visual Studio(Pro 2013)をデバッグモードで使用していますが、リリースモードに変更したり、.exeファイルを実行しようとすると機能しません。

編集:エラーはなく、解像度(黒いモニタ)は変わるようですが、解像度は変わりません。また、管理者権限で実行しようとしました。

誰かが私の問題を解決するアイデアはありますか?

ありがとうございます!

コード:

#include <Windows.h> 

struct SResolution 
{ 
    int x; 
    int y; 
}; 

static SResolution R_1440x1080 = { 1440, 1080 }; 
static SResolution R_1920x1080 = { 1920, 1080 }; 

bool GetPrimaryDisplayDevice(DISPLAY_DEVICE& _rDisplayDevice); 

int main() 
{ 
    SResolution Resolution = R_1920x1080; // R_1440x1080 R_1920x1080 

    DISPLAY_DEVICE DDevice; 
    DEVMODE   lpDevMode; 
    DEVMODE   lpDevMode2; 

    ZeroMemory(&DDevice , sizeof(DDevice)); 
    ZeroMemory(&lpDevMode , sizeof(lpDevMode)); 
    ZeroMemory(&lpDevMode2, sizeof(lpDevMode2)); 

    DDevice.cb  = sizeof(DDevice); 
    lpDevMode .dmSize = sizeof(lpDevMode); 
    lpDevMode2.dmSize = sizeof(lpDevMode2); 

    if (!GetPrimaryDisplayDevice(DDevice)) return 0; 

    if (!EnumDisplaySettings(DDevice.DeviceName, ENUM_CURRENT_SETTINGS, &lpDevMode)) return 0; 

    // if (Resolution.x == lpDevMode.dmPelsWidth && Resolution.y == lpDevMode.dmPelsHeight) return 0; 

    int i = 0; 

    while (EnumDisplaySettings(DDevice.DeviceName, i, &lpDevMode)) 
    { 
     if (Resolution.x == lpDevMode.dmPelsWidth && Resolution.y == lpDevMode.dmPelsHeight) 
     { 
      lpDevMode2 = lpDevMode; 
     } 

     i++; 
    } 

    lpDevMode2.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_POSITION | DM_DISPLAYFREQUENCY | DM_DISPLAYFLAGS; 

    DWORD Flags = CDS_UPDATEREGISTRY | CDS_FULLSCREEN; 

    if (ChangeDisplaySettings(&lpDevMode2, Flags) != DISP_CHANGE_SUCCESSFUL) 
    { 
     MessageBox(NULL, (LPCWSTR)L"Fail", (LPCWSTR)L"Error", MB_ICONHAND); 
    } 

    return 0; 
} 

bool GetPrimaryDisplayDevice(DISPLAY_DEVICE& _rDisplayDevice) 
{ 
    DWORD   NumberOfDevice = 0; 
    DWORD   dwFlags = 0; 

    while (EnumDisplayDevices(NULL, NumberOfDevice, &_rDisplayDevice, dwFlags)) 
    { 
     DISPLAY_DEVICE InnerDDevice = { 0 }; 
     DWORD   InnerNumberOfDevice = 0; 

     ZeroMemory(&InnerDDevice, sizeof(InnerDDevice)); 
     InnerDDevice.cb = sizeof(DISPLAY_DEVICE); 

     if (_rDisplayDevice.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) 
     { 
      return true; 
     } 

     NumberOfDevice++; 
    } 

    return false; 
} 

EDIT2:は解決しました。私はこのフラグを削除しただけCDS_UPDATEREGISTRYを使用してきました

DWORD Flags = CDS_FULLSCREEN | CDS_UPDATEREGISTRY; 

ChangeDisplaySettings(&DMode, CDS_UPDATEREGISTRY); 

: -問題がでCDS_FULLSCREENフラグでした。今それは動作します。私を助けてくれたり、私にヒントを与えたすべての人に

感謝:)

+0

おそらく未定義の動作が発生しましたか? –

+0

ああ私は言及するのを忘れてしまった:Xいいえ。それは解像度を変えているように見えますが、それはしません。エラーなし – Chris

+0

リリースとデバッグの設定が同じですか? – tambre

答えて

2

それは実際に解像度を変更しません。この

if (ChangeDisplaySettings(&lpDevMode2, Flags) != DISP_CHANGE_SUCCESSFUL) 
{ 
    MessageBox(NULL, (LPCWSTR)L"Fail", (LPCWSTR)L"Error", MB_ICONHAND); 
} 

このような
else 
{ 
    MessageBox(NULL, (LPCWSTR)L"Success", (LPCWSTR)L"Congrats", MB_ICONHAND); 
} 

後elseステートメントを追加すると、プログラムが終了したときに、解像度を変更したがスイッチバックしていることがわかります。

私はそれを修正する方法がわからないので、私はコメントとして投稿したいと思っていましたが、まだコメントするのに十分な評判はありません。

+0

実際には多くの助けた。私は今問題がCDS_FULLSCREENフラグであることを知っています...しかし、私は解像度を伸ばすためにその1つが必要です:X – Chris

関連する問題