【C#】Windows Formsの高DPI対応【2023年版】

Windows Forms で作成されたアプリの高 DPI 対応の 2023 年版の設定の話です。

この設定ですが、過去に色々と試行錯誤があったせいで情報が錯綜しています。この記事の最新の方法では各種設定が整理されて簡単に指定することができるようになりました。

確認環境

  • .NET 4.7 以降(確認は4.7.2で実施)
  • Windows11
  • VisualStudio 2022

この記事は、FHD100% 表示のディスプレイと、4K 150%のディスプレイで確認しています。

背景的な説明

今まで、マニフェストで高DPIの設定をしてもまぁ本当に言うことを聞きませんでした。

  • <dpiaware>true</dpiaware> を指定
    • 4K 150% → FHD 100% にウインドウを移動するとフォントがぼやける
  • <dpiaware>true/PM</dpiaware> を指定
    • 4K 150% → FHD 100% にウインドウを移動するとクソデカウインドウのままサイズが調整されない

結局何を指定してもどうしようもないみたいな状態になってました。

一番新しい形式ではではこれが解消されているようです。今回はこの方法を紹介したいと思います。

重要:

dpiaware と dpiAwareness を使用する方法は .NET 4.7 以降非推奨になりました。以降、新しい設定方法を使用する必要があります。

設定方法

設定方法ですが、2つ設定が必要です。

まず、マニフェストの設定を以下の通りコメントインします。

// app.manifest

<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
        <!-- Windows 10 & 11-->
        <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
    </application>
</compatibility>

Windows 10 と Windows11 は ID が共通です。もう Windows10 以前の 8.1 とか存在しない扱いでよいので、無視していいと思います。

次に App.config の設定です。

// App.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
    </startup>

   <!-- ★以下のノードを追加 -->
    <System.Windows.Forms.ApplicationConfigurationSection>
        <add key="DpiAwareness" value="PerMonitorV2" />
    </System.Windows.Forms.ApplicationConfigurationSection>
</configuration>

これで 4K 150% ディスプレイの時は拡大された表示、FHD 100% のウインドウにアプリを移動したときは縮小(というか通常の表示?)となます。フォント表示が各々のディスプレイでぼやける事も無くなります。自分で画像を描画しているとか、がちがちにレイアウト組んでるとかでなければ割といい感じに勝手にしてくれると思います。

スケーリング環境で確認するかどうかはさておきこの設定は必ずしておいたほうがいいかもしれません。

また、この対応は .NET 4.7 以降のみので古い .NET Framework には対応していません。古いバージョン使ってる人が居たらこれを機に最後の .NET 4.8.1 に移行しちゃうとか?個人のツール程度ならそう問題起きないんじゃないかな。しらんけど。

上記の App.confg はビルドするとアプリ名と同じ名前の .config が生成されますが、そのファイルを EXE と同じフォルダ内に入れてい置いておかないと高 DPI の設定が有効化されないので注意してください。

参考サイト

MSDN:Windows フォームでの高 DPI のサポート(MSDN は頻繁に URL が変更されてリンクが非常に切れやすいのでリンク切れの場合、タイトルで検索してください)

learn.microsoft.com