« ComfyUIの「Prompt has no outputs」というエラーは「ワークフローに結果を出力するノードが含まれていない」という意味 | トップページ | 画像生成AIで遊んでいる人の役にたつかもしれません »

2026年1月 2日 (金)

WindowsのDPIの違うマルチモニター環境でWPFアプリの文字がボケないようにする

いくら探してもちゃんとした説明が見つからないし、ChatGPT 5が教えてくれたやり方も機能しなかった。

正解は shibayan/WPF-PerMonitorV2-Sample にあった (芝村さん、ありがとうございます!) が、解説が一切ない。せっかくなので、私が理解した範囲で解説しておく。

何が問題か

最近のWindowsでは、「ディスプレイ」の「拡大/縮小」という機能によってモニターごとに「倍率」を指定できる。開発者ではないユーザー向けの説明には「OSが自動的にアプリの表示を拡大縮小します」と書いてある。起動したアプリのウインドウを倍率が違うモニターに動かすと、アプリが何もしない場合は確かに「OSが自動的に表示を拡大縮小する」のだが、これは画像としての拡大縮小なので文字がボケて読みにくくなってしまう。

でも、Windowsの標準のアプリ (エクスプローラーとかメモ帳とか) はどれも、文字がボケずに表示される。それは、「アプリが何とかするので、OSは倍率の通知だけやってくれ」というモードがあって、それを使っているから。実際には個々のアプリが自分で「何とかするコード」を書くわけではなくてUIフレームワークが何とかしてくれる。今回の私の関心事はWPFなのだが、もちろんWPFもその機能を備えている。

…のだが、(マイクロソフトによると「互換性のために」) デフォルトではこの機能が無効になっている、というか、使い勝手の悪いモードがデフォルトになっているので、そのままだと結局文字がボケてしまう。この設定を変えれば解決する。

設定方法

プロジェクトにapp.manifestを追加して、次のように書く。

<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>
</application>
</assembly>

※ プロジェクトにすでにapp.manifestが存在する場合は、それとマージする。新規に追加する場合、asseblyIdentity要素は、もちろんこの例のままじゃなくて適切な値に書き換える必要がある。

文字がボケる件に関係するのはdpiAwareness要素とdpiAware要素で、この内容は丸写しでいいはず。

Windows 10のサポートが終了し、Windows 12もリリースされていない現在では、dpiAwarenessは「PerMonitorV2」固定でいいと思うのだが、実際には5通りの設定が書けるようだ。その説明はここにある。ただし、この説明はWindows Forms用のMSBuildプロジェクトファイルの説明なのでApplicationHighDpiModeなんていう要素名になっている。XMLの書き方はWPFとは違うので参考にしてはいけない。

※ 「だったら、なんでそんなページを参照するのか」と思うだろうが、それはマイクロソフトの公式ドキュメントでPerMonitorV2の説明が他に見つからないからだ。一体、どうなっているのだろう。

.NET Framework 4.8 以降と.NET 6 (というか、Windows Desktop 6 なのか?) 以降で使えるはず。

本題と関係ない追記

大晦日の深夜に、1年ぶりにSecond Lifeにログインして、Arare Cafeにおじゃましたわけですが、ほとんど動かず会話もせずにじっとしていたのは、実は裏で本件の調査をしていたからでした。ちょっと急ぎだったのですが、年が明けた時点ではまだ解決していなかったので、SLはおろそかになってしまいました。久しぶりだったのに失礼しました。

« ComfyUIの「Prompt has no outputs」というエラーは「ワークフローに結果を出力するノードが含まれていない」という意味 | トップページ | 画像生成AIで遊んでいる人の役にたつかもしれません »

コメント

コメントを書く

(ウェブ上には掲載しません)

« ComfyUIの「Prompt has no outputs」というエラーは「ワークフローに結果を出力するノードが含まれていない」という意味 | トップページ | 画像生成AIで遊んでいる人の役にたつかもしれません »

フォト
無料ブログはココログ