高DPIの設定だと、ディスプレイの正確なピクセル数が取得できない問題。
そもそもDPIとはなんぞ…ということでまとめる
ふむふむ、要するに解像度のことか。
高DPI環境の簡易テスト方法
Windowsの設定にある、ディスプレイの解像度とスケールを変えればいい
改善前: SystemParametersInfo
関数を使用していた
SystemParametersInfo
を使用して、メインディスプレイの大きさを調べていた。
残念ながらこの関数、何も設定していないと常に 96dpi で計算してしまう…
改善後: SetProcessDPIAware
を呼び出す
GetDeviceCapsが常にDPI96を返す問題と解決方法について · GitHub
Windows 7 以降の対応をすれば良いので、遠慮なく呼び出した。 manifestファイルはないので一旦無視。
その他考察
Display Scaling in Windows 10
Microsoftの中の人たちが考えている、高解像度ディスプレイの対応について。
Display Scaling in Windows 10 | Ask the Core Team
細かくは読んでない ><
「Basic concepts and terms」にある画像を見てみると色々書いてある。
(画像だから気軽にGoogle先生できない。つらい)
しれっとpixcel/inchって書いてるのに、なぜか160「DPI」と書かれている。良いのか…?
Physical Pixels と Effective Pixels 。ざっくり理解だと
- Physical Pixels はディスプレイのドットに対して正確なピクセルのこと
- Effective Pixels はどんなディスプレイ上でも、画面上に表示される大きさは同じ値なら同じ大きさになる
ということらしい。
Vieewing Distanceはとりあえずおいておく。
最後の Scale Factor が、Physical PixelsをEffective Pixelsに変換するための倍率のことのようだ。
Windowsの設定にあるスケールってこれのこと…?だろうか…?
関連するけどまだ読めてない奴ら
まだ読めてない ><
今は読む必要ないかな…と思って…