はじめに
タイトルには、マルチモニターとありますが、単純に自分が実行する画面の情報を取得するだけの話です。(笑)では、なぜタイトルにマルチモニターと付けたかと言いますと、画面の情報が欲しくなる時のほとんどが、マルチモニター環境を想定した時に発生しているように思います。
画面の位置情報を覚える機能をつけたのだが、マルチモニター環境で利用した後に、シングルモニターにしたら、画面外にフォームが移動してしまう。
監視プログラムを、サブ画面に表示したい等
その辺を中心に解説をしたいと思います。
解説
今回の話題の中心は、System.Windows.Forms.Screen
となります。早速画面の情報を取得してみましょう。
var screenString = ""; foreach (var screen in System.Windows.Forms.Screen.AllScreens) { screenString += screen.ToString() + "\r\n"; } MessageBox.Show(screenString);
私の環境で実行すると、以下のように取得されました(見やすいように改行してあります)
Screen[Bounds={X=0,Y=0,Width=1920,Height=1200}
WorkingArea={X=0,Y=0,Width=1920,Height=1160}
Primary=True
DeviceName=\\.\DISPLAY1
Screen[Bounds={X=-1600,Y=0,Width=1600,Height=1200}
WorkingArea={X=-1600,Y=0,Width=1600,Height=1200}
Primary=False
DeviceName=\\.\DISPLAY2
見てもらうと分かるとおり、実際の画面のサイズ、使える領域、プライマリモニタ、デバイス名
が取得できています。
では、実戦で使う方法を紹介したいと思います。
監視プログラム等を作成すると、マルチモニターで2画面目に起動させたくなる時があるかと思います。
基本的には、画面の位置をLoadイベントで設定してあげればいいのですが、最初から最大化されていると、起動位置を設定することができませんので、その部分だけがコツとなります。
try { this.WindowState = FormWindowState.Normal; this.MaximizedBounds = Screen.AllScreens[0].Bounds; //この数字を変える } finally { this.WindowState = FormWindowState.Maximized; }
AllScreens[0]の数字を変えることにより、好きなスクリーンからアプリケーションをスタートさせる事が出来ます。
おわりに
まぁ、今更感のあるSystem.Windows.Forms.Screenですが、ちょっと前の仕事で使ったので、紹介してみました。調査環境
VS2010 + WinFormC#
