こんばんはー、モノトーンです。
今夜は物語シリーズと超電磁砲放送なので早く寝ないといけないのですがどうしてもブログ書き終えてから寝たいということなんで、サンプルプログラムにバグがいっぱいある状態ですが、それでも公開します。あくまでもテスト検証用だと思ってください。
概要
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)
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 アプリではこういう情報ってかなり重宝するしね。
以上。おやすみなさい。