やる気がストロングZERO

やる気のストロングスタイル

【WPF】高DPIディスプレイの場合、Screenオブジェクトから取得するサイズはDPI仮想化の比率で計算し直す必要がある

高DPIディスプレイのノートと普通のディスプレイでデュアルディスプレイを設定しているような場合、wpfアプリでscreenのサイズが直感どおりに使えなかったのでメモ

環境例

例えば上記の高DPIディスプレイノートをprimalyディスプレイとして、普通のディスプレイをその右側に配置する。
左側:ノートのディスプレイサイズは横幅1920 縦幅1080(ディスプレイ1)
右側:据え置きディスプレイが横幅2880 縦幅1800(ディスプレイ2)

したいこと

あるwindowを「ディスプレイ2」の左端ピッタリに表示させたい。
方法としては、「ディスプレイ2」の左端の位置を取得し、window.Leftへセットすれば出来ると思ったが、

window.Left = System.Windows.Forms.Screen.AllScreens[1].WorkingArea.Left

上記環境の場合は「ディスプレイ2」の左橋から右へだいぶズレたところに表示されてしまう。

対策

正しくセットするには、DPI仮想化の比率を取得し、計算してやる必要がある。

double dpi仮想化比率 =  PresentationSource.FromVisual(window).CompositionTarget.TransformFromDevice.M11;// DPI仮想化の比率を取得。参考にした)http://james-ramsden.com/c-get-dpi-screen/
window.Left = System.Windows.Forms.Screen.AllScreens[1].WorkingArea.Left * dpi仮想化比率

これで、意図通りに表示できた。