none
[デスクトップのカスタマイズ]>[ディスプレイ]設定値の取得方法 RRS feed

  • 質問

  • いつもお世話になり、ありがとうございます。

    「デスクトップのカスタマイズ」で「ディスプレイ」の設定ができます。ここでの設定値を取得したいと思っています。
    が、どのクラスを使えばよいのか、あるいはレジストリーを参照すればよいのか・・・見当がつきません。
    取得したい値は下図の①~3ですが、最優先は①の標準サイズに対する割合(%)です。
      
    ご教示くださるようお願いいたします。

    以上
    2015年7月9日 8:26

回答

  • 3以外の値は、dpiAware(DPI連動)のフラグが設定されていないと取得できない(反映されない)値になります。

    3以外については、かなり古い記事で申し訳ないですが、

    http://msdn.microsoft.com/ja-jp/magazine/dn574798.aspx

    に、1, 2 の部分については記事があります。

    3は、SystemParametersInfo API で取得できます。.NET Framework にこのAPIに相当するものがあるかは調べたことがないのでわかりません。


    とっちゃん@わんくま同盟, Microsoft MVP for Visual C++ (Oct 2005-) http://blogs.wankuma.com/tocchann/

    • 回答としてマーク Ashidacchi 2015年7月13日 8:45
    2015年7月9日 9:30

すべての返信

  • そもそも対象とする言語、ランタイムはなんでしょうか? 質問文に「どのクラス」とありましたからWindows APIではないと予想して…

    とりあえず③はSystemFonts.CaptionFontのSizeプロパティですね。

    2015年7月9日 9:26
  • 3以外の値は、dpiAware(DPI連動)のフラグが設定されていないと取得できない(反映されない)値になります。

    3以外については、かなり古い記事で申し訳ないですが、

    http://msdn.microsoft.com/ja-jp/magazine/dn574798.aspx

    に、1, 2 の部分については記事があります。

    3は、SystemParametersInfo API で取得できます。.NET Framework にこのAPIに相当するものがあるかは調べたことがないのでわかりません。


    とっちゃん@わんくま同盟, Microsoft MVP for Visual C++ (Oct 2005-) http://blogs.wankuma.com/tocchann/

    • 回答としてマーク Ashidacchi 2015年7月13日 8:45
    2015年7月9日 9:30
  • 佐祐理 さん、

    早速のリプライ、ありがとうございます。

    お教えいただいた SystemFonts.CaptionFont は、名前のとおり Caption の Font のようです。
    「ウィンドウのタイトル バーにテキストを表示するために使用される Font。」と書いてありました。
    なので、残念ながら、③には合致していないと思います。

    なお、言語は VB.NET。実行環境は .NET Framework 4.5 にするつもりです。
    Windows の API でも、クラスでも、あるいはレジストリー関連でも、言語にはあまり依存しないと思ったので記載しませんでした。制限すると回答が狭められるとも思いました。
    すみません、以後は記載するようにいたします。

    以上



    2015年7月9日 9:53
  • とっちゃん さん、

    早速のご回答、ありがとうございます。

    頂戴したご回答に質問するのは失礼かも知れませんが、お教えいただけますか?
    「dpiAware(DPI連動)」とは、Visual Studio でのフォームデザイナーで指定する AutoScaleMode のことでしょうか?

      

      私が DPI と聞いて、真っ先に思い出すのが上のことです。間違っていたら、ぜひご教示くださるようお願いいたします。

    お教えいただいた、http://msdn.microsoft.com/ja-jp/magazine/dn574798.aspx については、今からじっくり読んでみます。
    直感的には、相当役に立つ記事のように思えました。

    また、SystemParametersInfo API は(たぶん)Win32 API ですよね?
    だとしたら、私にも扱えると思います。

    まだしっかり読んだ・試したわけではありませんが、取り急ぎ、お礼申し上げます。

    以上


    2015年7月9日 10:11
  • はい。

    でも、記憶が確かなら、モニタごとの...(2のチェック状態が外れている場合)には対応していなかった気がします。

    1年前の記事ですが、MSのエバンジェリストの田中達彦さんの記事も張っておきます。都合4回の連載ですが、.NET 関係でのことも書いてあるので、こちらも参考になるかと。
    http://blogs.msdn.com/b/ttanaka/archive/2014/07/16/dpi-high-dpi-1-dpi.aspx

    この記事によると VS2013 では、WPFと、MFC(というよりは、Nativeのダイアログボックス) は、デフォルトで SystemDPI 対応(2のチェックがついている環境相当)、Windows Forms はそもそも高DPI非対応(通常はOSが勝手に拡大してくれるため、ちょっとぼけた感じになる)らしいです。

    田中さんの記事にもいろいろ書いてありますが他にも、「高DPI」あるいは、 「HighDPI」で検索するといろいろヒットするので、自分の求めている情報がないか探してみてください。

    ちなみに、SystemParamersInfo はWin32APIですが、佐祐理さんの提示していた SystemFonts クラスや、SystemInformation クラスで、取得できるようになっています(両方とも調べてみました)。

    全部とれるかどうかは未確認なのでわかりません(いっぱいありすぎて調べるのが大変な為)。


    とっちゃん@わんくま同盟, Microsoft MVP for Visual C++ (Oct 2005-) http://blogs.wankuma.com/tocchann/

    • 回答の候補に設定 星 睦美 2015年7月13日 8:29
    2015年7月9日 11:09
  • とっちゃん さん、

    いろいろとお調べいただき、ありがとうございます。

    # 実は、田中達彦さんの記事(第1回)でコメントさせていただいている北窓舎のオヤヂは私です。
      その後の記事(第2回目以降)を読みたかったのですが、田中さんのお名前も忘れてしまい、
      ずっと見つけられないでいました。

    # マルチモニターが珍しくなくなり、また高密度のモニターが増えた今では、
      ユーザー環境で、開発環境と同じ見え方を期待するのが難しくなりました。
      拙作ソフトのユーザーさんからも文字が大きくてボタン上に収まりきらないなどと言われたりしています。

    本題と違うことを書いて申し訳ありませんでした。
    明日、ゆっくり調べてみます。


    以上

    2015年7月9日 11:32
  • いまいち返信の意味がわかりませんでした。

    画像を見る限り、タイトルバーのフォントを求めているように受け取りましたが、タイトルバーのフォントはタイトルバーのフォントではなかったということでしょうか? 一応回答前にタイトルバーのフォントの値と一致するか確認しましたが、正しく反映されていました。

    とっちゃんさんの回答は少し足りてなくて、まず②について取得する目的が必要になってきます。

    詳しくはHigh DPIとその下のWriting DPI-Aware Desktop and Win32 Applicationsを読んでいただくとして、②はPer Monitor DPIの有効/無効を制御するチェックボックスですが、同時にPer Monitor DPI未対応のアプリケーションに対してはDPI virtualizationが働きます。つまりPer Monitor DPI対応アプリケーションであればチェックボックスの値は無関係ですし、未対応アプリケーションに対してはDPI変更そのものが通知されません。

    というわけで作成しようとしているアプリケーションはDPI Awareness Levelをどれにするつもりでしょうか?

    2015年7月9日 11:37
  • >本題と違うことを書いて

    FAQの作成ページではありませんし、まったく関係のない話でもないので、問題はないと思いますよ。


    とっちゃん@わんくま同盟, Microsoft MVP for Visual C++ (Oct 2005-) http://blogs.wankuma.com/tocchann/

    2015年7月9日 11:37
  • 佐祐理 さん、

    失礼いたしました。

    ③のスクリーンショットではタイトルバーしか見えていないので、その点で佐祐理さんのご回答は10 0%正解でした。③はブルダウン(ComboBox)なので、私の頭の中では全部の項目を取得できる何かをイメージしていました。申し訳ありませんでした。

    後追いになりますが、元々の意図は、ラベルやテキストボックスのサイズに応じてフオントサイズを自動計算したい、です。

    そこで問題になるのが、画面全体の拡大率(標準サイズに対する割合)だと思ったので、その設定を行うスクリーンショットを提示し、その結果の値を取得する方法を質問した次第です。.

    素人の深読み、つまりは見当外れの思い込みだったかも知れません。

    DPI Awareness Level」というのが何なのか、どこで設定するものなのかを分っていません。外れているように思いますが、作る予定のソフトでは AutoScaleMode を DPI にするつもりです。

    以上

    2015年7月9日 12:11
  • ご自身は言及もせずコンボボックスに隠れた範囲まで質問に含むとするとし、私の提示したリンク先には左ツリーに他のフォントプロパティも表示されているにも関わらず回答に含まれないとし、「合致していない」とするのはどうかと思います。

    VB.NETアプリケーションでシステムの設定に応じてサイズ調整されたいということでしたら、これらの設定を読む必要はなく、DPI Awareness Levelについて理解した上で、アプリケーションマニフェストに

      <dpiAware>True</dpiAware>

    を記載してはどうでしょうか。具体的な手順は他の方が提示されている田中さんの記事に書かれています。

    ただしこの方法は②のチェックオフ状態、Per Monitor DPI有効状態には対応しきれておらず表示がぼやけることになります。

    2015年7月9日 13:53
  • とっちゃんさん、返信が遅くなり申し訳ありません。

    ご回答いただいた「3は、SystemParametersInfo API で取得できます。」は、私の読解力不足かもしれませんが、求める値を取得できそうにありませんでした。
    このままですと、本スレッドがクローズしないので、回答としてマークさせていただきます。ありがとうございました。

    以上

    2015年7月13日 8:45