none
GetScaleFactorForMonitor RRS feed

  • 質問

  • 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);
    

    2022年9月22日 1:36

回答

  • Brilliaさん、こんにちは。フォーラムオペレーターのSakiです。
    ご返信いただき、ありがとうございます。

    GetScaleFactorForMonitorはWindows ストアのスケーリング モードに基づいており、
    実際にはデスクトップ アプリケーションのスケーリング モードとは異なりますが、
    GetDpiForMonitor関数を使用することをお勧めします。

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Saki ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。

    • 回答としてマーク Brillia 2022年9月30日 5:29
    2022年9月29日 8:46
    モデレータ

すべての返信

  • https://stackoverflow.com/questions/63692872/is-getscalefactorformonitor-winapi-returning-incorrect-scaling-factor

    ここによるとGetScaleFactorForMonitorはDPI_AWARENESSがUNAWAREのときだけ正しい値を返すってことのようですね。

    で、「この関数」ってのはGetScaleFactorForMonitorのことでしょうか、GetDpiForMonitorのことでしょうか。

    2022年9月22日 2:03
  • >で、「この関数」ってのはGetScaleFactorForMonitorのことでしょうか、GetDpiForMonitorのことでしょうか。GetScaleFactorForMonitor関数です。

    applicationではつぎの設定をマニフェストファイルに入れていました。

     <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness>
    ただ、プロジェクトからマニフェストファイルの削除、プロジェクトの設定で「DPI認識:なし」しても結果同じでした。


    2022年9月22日 4:42
  • Brilliaさん、こんにちは。フォーラムオペレーターのSakiです。
    MSDNフォーラムにてご投稿くださいましてありがとうございます。

    GetScaleFactorForMonitor 関数が成功すれば、S_OK が返されます。 
    そうでなければ、HRESULT エラー コードを返します。 
    お手数ですが、このドキュメントをご確認いただきますようお願いいたします。

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Saki ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。

    2022年9月26日 6:36
    モデレータ
  • 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%)で戻ってきます。
    原因がわかりません。

    2022年9月28日 5:25
  • Brilliaさん、こんにちは。フォーラムオペレーターのSakiです。
    ご返信いただき、ありがとうございます。

    GetScaleFactorForMonitorはWindows ストアのスケーリング モードに基づいており、
    実際にはデスクトップ アプリケーションのスケーリング モードとは異なりますが、
    GetDpiForMonitor関数を使用することをお勧めします。

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Saki ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。

    • 回答としてマーク Brillia 2022年9月30日 5:29
    2022年9月29日 8:46
    モデレータ