モノトーンの伝説日記

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

高解像度厨が Windows 8.1 のスケーリングについてのお話を書いてみる。(3) ~ WPF で無理やりスケーリング対応する

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

 今夜は物語シリーズと超電磁砲放送なので早く寝ないといけないのですがどうしてもブログ書き終えてから寝たいということなんで、サンプルプログラムにバグがいっぱいある状態ですが、それでも公開します。あくまでもテスト検証用だと思ってください。

概要

  1. WPF で Per monitor dpi に対応したい
  2. まずは API 使ってみるよねっ
  3. それじゃあどうするの?
  4. まとめと GitHub

1. WPF で Per monitor dpi に対応したい

 誰しもが考えること。Windows 8.1 Preview 搭載 .NET Framework 4.5.1 ではデフォルトで Per monitor dpi が有効になっていません。その場合のお話。

 前回の
  高解像度厨が Windows 8.1 のスケーリングについてのお話を書いてみる。(2)
についても参照ください。なお、この記事はどうしても、という方限定でお願いします。今後の Microsoft の動向を調査の上、正規のプログラムに乗せるかはご自身の判断でお願いします。

2. まずは API 使ってみるよねっ

 前回の記事にもあります通り、SetProcessDpiAwareness を使いたくなりますよね。この気持ちわかります。使ってみた:
 System.UnauthorizedAccessException
アクセス拒否られた… そういうことなんですよ。じゃあ次に何考えるって話よね。

3. それじゃあどうするの?

 皆さんもご存知の通り、High dpi に対応しているかはマニフェストで告知することができます。Windows 8.1 モードで動作させるためにすでにマニフェストは準備していると思います、そこに:
 <dpiAware>True/PM</dpiAware> または <dpiAware>Per monitor</dpiAware>
と入れておきます。すると、あら不思議。GetProcessDpiAwareness の値が PROCESS_MONITOR_DPI_AWARE になって帰ってくるではありませんか。

 ここまでくれば、もうできるよね? だって WPF の知識はみなさんのほうがずっと上だもん…

4. まとめと GitHub

 ここに書いてある情報は RTM で変更になるかも。特に WPF 自体で Per-monitor dpi を対応する可能性は高いなぁ。

 ところで、自分は FMV LIFEBOOK WU1/L (WQHD+ 3200x1800) の後継機種狙っているんだけどこのレベルの環境をメイン運用すると、絶望することが多々ありそうですね… そうならないためにも多くの方がぜひぜひ Per monitor dpi に対応してほしいわけです。あと暫定的でもいいから、対応したい! って方もいるでしょうし、そういう方への道しるべとなれば幸いかと。

 GitHub にてサンプルプログラムを公開しています。(検証は十分しておりません)
 GitHub:: mntone/PerMonitorDpi (https://github.com/mntone/PerMonitorDpi)

f:id:mntone:20130727234602p:plain

Let’snote J10 内臓ディスプレイで実行 (10.1 inch FWXGA 1366x768 log. 96 dpi, phy. 155.16 ppi)

既知のバグ

  • xaml で Top や Left を指定すると起動しない (よくわかりません、ウィンドウが出てこない)
  • WM_DISPLAYCHANGE の イベントが来たとき、なんかおかしくなる (誤動作防止が必要?)

総括

 無理やりだけどできてよかったなーという感じ。Windows 8.1 Preview 常用しているユーザーだけど、こういうことも研究進めないとなーといろいろ思う。native アプリではこういう情報ってかなり重宝するしね。

 以上。おやすみなさい。

こちらの記事もご覧ください