質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.53%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

365閲覧

ChangeDisplaySettingsが効かない

valval

総合スコア43

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2023/09/02 03:53

実現したいこと

ChangeDisplaySettingsを用いて、アプリの使用に合わせた画面解像度に設定後、アプリ終了直前に元に解像度に戻したいです。

前提

最初は横1920✕縦1080のディスプレイに対し、Windows設定のシステム>ディスプレイから横1680✕縦1050の解像度に設定します。
次に、本アプリを起動し、ChangeDisplaySettings関数でディスプレイ設定を横1920✕縦1080にします。

発生している問題

アプリ終了直前に、同じくChangeDisplaySettings関数で横1680✕縦1050に戻そうとしても戻りません。
どうすれば戻りますか。

該当のソースコード

C++

1 2POINT screensizeOld; 3 4void ChangeDisplayMode(HWND hWnd,LONG w,LONG h) 5{ 6 //ディスプレイデバイス情報取得 7 DISPLAY_DEVICE DispDev; 8 DEVMODE defaultMode; 9 10 ZeroMemory(&DispDev, sizeof(DispDev)); 11 DispDev.cb = sizeof(DispDev); 12 13 14ZeroMemory(&defaultMode, sizeof(DEVMODE)); 15defaultMode.dmSize = sizeof(DEVMODE); 16EnumDisplayDevices(NULL, NULL, &DispDev, 0); 17 18 19 20 if (EnumDisplaySettings(DispDev.DeviceName, ENUM_REGISTRY_SETTINGS, &defaultMode)) { 21 22 //現在のディスプレイ解像度を格納。 23 screensizeOld.x = defaultMode.dmPelsWidth; 24 screensizeOld.y = defaultMode.dmPelsHeight; 25 26 //引数で設定した解像度を格納 27 defaultMode.dmPelsWidth = w; 28 defaultMode.dmPelsHeight = h; 29 ChangeDisplaySettings( &defaultMode,0);//解像度を変更 30 31 } 32 else 33 { 34 screensizeOld.x = 0; 35 screensizeOld.y = 0; 36 } 37

試したこと

上記29行目でブレークポイントを貼り、アプリ終了時にここを通過していることは確認済みです。
また、このとき、w,hには1680,1050が格納されています。

補足情報(FW/ツールのバージョンなど)

Microsoft Visual Studio Community 2022 (64 ビット) - Current
Version 17.4.4
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

1

ベストアンサー

解像度を変更するときは、EnumDisplaySettings で得られた DEVMODE 構造体は変更しないほうが良いです。
列挙して、以下の値

・dmBitsPerPel
・dmPelsWidth
・dmPelsHeight
・dmDisplayFlags
・dmDisplayFrequency

をチェックして、条件を満たすものを適用します。

イメージ

C++

1for (int i = 0; EnumDisplaySettings(DispDev.DeviceName, i, &defaultMode); i++) { 2 if (条件) { 3 ChangeDisplaySettings(&defaultMode, 0); 4 break; 5 } 6}

戻すときは、解像度を変更する前に EnumDisplayDevices の第2引数を ENUM_CURRENT_SETTINGS で取得した DEVMODE 構造体を保存しておいて適用すればいいと思います。

投稿2023/09/02 07:31

KOZ6.0

総合スコア2597

valval👍を押しています

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

valval

2023/09/02 10:40

ありがとうございます。 下記の要領でいけました。 ```C++ DEVMODE OldDisplayDefaultMode;//変更前のディスプレイ状態を格納 //アプリ開始時はBegin=true 終了時はfalse void ChangeDisplayMode(HWND hWnd,LONG w,LONG h,bool Begin) { //ディスプレイデバイス情報取得 DISPLAY_DEVICE DispDev; DEVMODE defaultMode; ZeroMemory(&DispDev, sizeof(DispDev)); DispDev.cb = sizeof(DispDev); ZeroMemory(&defaultMode, sizeof(DEVMODE)); defaultMode.dmSize = sizeof(DEVMODE); EnumDisplayDevices(NULL, NULL, &DispDev, 0); if (Begin) { ZeroMemory(&OldDisplayDefaultMode, sizeof(DEVMODE)); EnumDisplaySettings(DispDev.DeviceName, ENUM_CURRENT_SETTINGS, &OldDisplayDefaultMode); for (int i = 0; EnumDisplaySettings(DispDev.DeviceName, i, &defaultMode); i++) { if ((Begin && defaultMode.dmPelsWidth == w && defaultMode.dmPelsHeight == h)) { ChangeDisplaySettings(&defaultMode, 0); break; } } } else ChangeDisplaySettings(&OldDisplayDefaultMode, 0); } ```
guest

0

ありがとうございます。
下記の要領でいけました。

C++

1DEVMODE OldDisplayDefaultMode;//変更前のディスプレイ状態を格納 2 3//アプリ開始時はBegin=true 終了時はfalse 4void ChangeDisplayMode(HWND hWnd,LONG w,LONG h,bool Begin) 5{ 6 //ディスプレイデバイス情報取得 7 DISPLAY_DEVICE DispDev; 8 DEVMODE defaultMode; 9 10 ZeroMemory(&DispDev, sizeof(DispDev)); 11 DispDev.cb = sizeof(DispDev); 12 13 ZeroMemory(&defaultMode, sizeof(DEVMODE)); 14 15 16 defaultMode.dmSize = sizeof(DEVMODE); 17 18 19 20 EnumDisplayDevices(NULL, NULL, &DispDev, 0); 21 22 if (Begin) 23 { 24 ZeroMemory(&OldDisplayDefaultMode, sizeof(DEVMODE)); 25 EnumDisplaySettings(DispDev.DeviceName, ENUM_CURRENT_SETTINGS, &OldDisplayDefaultMode); 26 27 for (int i = 0; EnumDisplaySettings(DispDev.DeviceName, i, &defaultMode); i++) { 28 29 if ((Begin && defaultMode.dmPelsWidth == w && defaultMode.dmPelsHeight == h)) { 30 ChangeDisplaySettings(&defaultMode, 0); 31 32 break; 33 } 34 35 } 36 37 38 } 39 else 40 ChangeDisplaySettings(&OldDisplayDefaultMode, 0); 41 42}

投稿2023/09/02 10:38

valval

総合スコア43

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.53%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

同じタグがついた質問を見る

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。