モノトーンの伝説日記

Apex Legends, Splatoon, Programming, and so on...

Windows 8.1 の “Per Monitor Dpi”に対応しよう

 こんにちはー、モノトーンです。

 今日は、“Per Monitor Dpi” に対応したアプリを書くための「情報」を提供したいと思います。

概要

  1. そもそも Per Monitor Dpi とは何なのか?
  2. 実は WPF、Per Monitor Dpi に対応していない。
  3. 増やそう! Per Monitor Dpi Apps

1. そもそも Per Monitor Dpi とは何なのか?

 「Monitor 毎に Dpi を設定できる」というもの。

 といっても、Windows が勝手に判定する面がでかいので、完全に自由ってわけじゃないです。Windows XP からスケーリングには対応していましたが、ディスプレイごとにスケーリング率をかえることができませんでした。ところが昨今 4K (4096x2160)、4K UHD/QFHD (3840x2160)、WQHD+ (3200x1800)、QWXGA+ (2880x1800)、WQHD (2560x1440) などの高解像度ディスプレイが登場してきました。

 ここでこういう問題が生じます。

私、高解像度な 13.3 inch WQHD の Ultrabook を使ってるの。スケーリング率は 150% なんだけど、21.5 inch FHD 外部ディスプレイにつなぐとすごくでかく表示されるの… すっごく見づらい。けど、内臓ディスプレイの設定変えたら今度は内臓ディスプレイが見づらくなるの…

 この問題、解決できます。

2. 実は WPF、Per Monitor Dpi に対応してない。

 そうなんです! 対応していないんです。そこで私が昔作ったツールを紹介します。

GitHub::mntone/PerMonitorDpi
https://github.com/mntone/PerMonitorDpi

 NuGet Galleryにもあります。

NuGet Gallery::PerMonitorDpi 1.0.2.1
http://www.nuget.org/packages/Mntone.PerMonitorDpi/

 使い方は簡単。include してマニフェスト書いて Window を PmWindow にするだけ。

3. 増やそう! Per Monitor Dpi Apps

 最後に、です。Per Monitor Dpi に対応する気なんてない、って方多いと思います。そうですね… としか言いようがありません。たぶんこんな意見帰ってきたりするんですよ。

スケーリングを 100% 以外で使うのがそもそもおかしいんだ。100% 以外のスケーリングをなぜ使っている?

とね。もうそういわれてしまえばこちらも言いようがないので仕方有りません。けどやる気のある方、Windows 8.1 は日本時間 2013 年 10 月 17 日 20 時からダウンロードできるようになります。ぜひ、その日に対応しませんか?

 それでは、これにてこの記事は終わりにさせていただきます。 おわり

追記

 以下のようなブックマークコメントがありました。

f:id:mntone:20131014235703p:plain

 これについてですが、基本的に WM_DPICHANGED というイベントを監視して駆動します。つまり、Windows が「ウィンドウの領域の半分超過、ほかのディスプレイに移ったか」を判別したうえでイベントが飛んできます。したがって、きっちり半分の状態は変化しません (既存の Dpi のまま)。1 px でもほかのディスプレイへの領域が大きくなった場合イベントが飛んできます。

 追記おわり。