はじめに

タイトルには、マルチモニターとありますが、単純に自分が実行する画面の情報を取得するだけの話です。(笑)
では、なぜタイトルにマルチモニターと付けたかと言いますと、画面の情報が欲しくなる時のほとんどが、マルチモニター環境を想定した時に発生しているように思います。

画面の位置情報を覚える機能をつけたのだが、マルチモニター環境で利用した後に、シングルモニターにしたら、画面外にフォームが移動してしまう。
監視プログラムを、サブ画面に表示したい等

その辺を中心に解説をしたいと思います。

解説

今回の話題の中心は、

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 + WinForm
C#

更新日

2011/06/23:アップ