トップ回答者
GetScaleFactorForMonitor

質問
-
VC++2019,windows10
GetScaleFactorForMonitor 関数を使用して各モニタの「拡大縮小とレイアウト」で設定した値を取得しようと思ったのですが、
プライマリ(175%)セカンダリ(150%)にしたところ、どちらも「SCALE_140_PERCENT」しか返ってきません。
下記のコードで各モニターで設定した拡大率を取得できているのですが、この関数の戻り値、役割はいったい何になるのでしょうか?UINT x, y; ::GetDpiForMonitor(hMonitor, MDT_EFFECTIVE_DPI, &x, &y); double display_scalling = (double)(x / 96.0);
回答
-
Brilliaさん、こんにちは。フォーラムオペレーターのSakiです。
ご返信いただき、ありがとうございます。
GetScaleFactorForMonitorはWindows ストアのスケーリング モードに基づいており、
実際にはデスクトップ アプリケーションのスケーリング モードとは異なりますが、
GetDpiForMonitor関数を使用することをお勧めします。
どうぞよろしくお願いいたします。MSDN/ TechNet Community Support Saki ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。
- 回答としてマーク Brillia 2022年9月30日 5:29
すべての返信
-
ここによるとGetScaleFactorForMonitorはDPI_AWARENESSがUNAWAREのときだけ正しい値を返すってことのようですね。
で、「この関数」ってのはGetScaleFactorForMonitorのことでしょうか、GetDpiForMonitorのことでしょうか。
-
>で、「この関数」ってのはGetScaleFactorForMonitorのことでしょうか、GetDpiForMonitorのことでしょうか。GetScaleFactorForMonitor関数です。
applicationではつぎの設定をマニフェストファイルに入れていました。
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness>
ただ、プロジェクトからマニフェストファイルの削除、プロジェクトの設定で「DPI認識:なし」しても結果同じでした。
-
Brilliaさん、こんにちは。フォーラムオペレーターのSakiです。
MSDNフォーラムにてご投稿くださいましてありがとうございます。
GetScaleFactorForMonitor 関数が成功すれば、S_OK が返されます。
そうでなければ、HRESULT エラー コードを返します。
お手数ですが、このドキュメントをご確認いただきますようお願いいたします。
どうぞよろしくお願いいたします。MSDN/ TechNet Community Support Saki ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。
-
Windows10 21H2 VC++2019(MFCAPP)、「拡大縮小とレイアウト」:175%で設定
次のコードで「拡大縮小とレイアウト」で設定したスケーリングを取得しています。
テストは、UNAWARE、SYSTEM_AWARE、PER_MONITOR_AWARE、PER_MONITOR_AWARE_V2でそれぞれ行いました。
HMONITOR hMonitor = ::MonitorFromWindow(m_hWnd, MONITOR_DEFAULTTONEAREST); DEVICE_SCALE_FACTOR factor; if (S_OK == ::GetScaleFactorForMonitor(hMonitor, &factor)) { CString s; s.Format(_T("GetScaleFactorForMonitor:%d%%"), factor); MessageBox(s); }
すべて、「SCALE_140_PERCENT」(140%)で戻ってきます。
原因がわかりません。 -
Brilliaさん、こんにちは。フォーラムオペレーターのSakiです。
ご返信いただき、ありがとうございます。
GetScaleFactorForMonitorはWindows ストアのスケーリング モードに基づいており、
実際にはデスクトップ アプリケーションのスケーリング モードとは異なりますが、
GetDpiForMonitor関数を使用することをお勧めします。
どうぞよろしくお願いいたします。MSDN/ TechNet Community Support Saki ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。
- 回答としてマーク Brillia 2022年9月30日 5:29