WPF でマルチモニターの領域サイズやプライマリモニターの解像度を取得する
こんにちは、kenzauros です。
WPF でウィンドウを指定位置に表示する際、スクリーン(モニター、ディスプレイ)の幅と高さを取得したいことがあります。
とにもかくにも SystemParameters
システムの情報を取得するには System.Windows.SystemParameters スタティッククラスのプロパティを使います。
プライマリモニターのサイズを取得する PrimaryScreenWidth/PrimaryScreenHeight
プライマリ(メイン)モニターのサイズ(解像度)を取得するには SystemParameters.PrimaryScreenWidth と SystemParameters.PrimaryScreenHeight を使います。
Console.WriteLine(SystemParameters.PrimaryScreenWidth);
Console.WriteLine(SystemParameters.PrimaryScreenHeight);
フル HD のモニターを使用している場合は 1920 と 1080 が得られるはずです。
プライマリモニターの作業領域を取得する WorkArea.Width/WorkArea.Height
プライマリモニターの作業領域のサイズを取得するには SystemParameters.WorkArea.Width と SystemParameters.WorkArea.Height を使います。
Console.WriteLine(SystemParameters.WorkArea.Width);
Console.WriteLine(SystemParameters.WorkArea.Height);
これは Windows のタスクバーなどを差し引いたサイズになるようですので、 1920 と 1040 などが得られると思います。この場合おそらくタスクバーによって縦方向のサイズが実際の解像度よりも低くなっています。
マルチモニターの全領域のサイズを取得する VirtualScreenWidth/VirtualScreenHeight
PrimaryScreen なんとかと WorkArea はいずれもプライマリモニターの情報しか返さないため、マルチディスプレイ環境で使っている場合は、全体の領域を取得できません。
そこですべてのモニターのスクリーン領域を取得するには SystemParameters.VirtualScreenWidth と SystemParameters.VirtualScreenHeight を使います。
Console.WriteLine(SystemParameters.VirtualScreenWidth);
Console.WriteLine(SystemParameters.VirtualScreenHeight);
たとえばフル HD のモニターを横並びで使用している場合は 3840 と 1080 が得られます。
あとがき:カレントモニターの情報は?
あともう一つ欲しいのは「現在のウィンドウが存在するモニターのサイズと位置」です。残念ながら WPF だけでは無理なようで、 WinForm 時代の System.Windows.Forms.Screen を利用して取得するしかないようです。
残念。。。