PR

[C#][WPF]2台目のモニタにフォームを表示する

C#

PCに複数のモニタを接続していると、指定したモニタにフォームを表示して欲しいという要望があがることがあります。

今回は、ノートPC+液晶外部モニタという環境で外部モニタ側にフォームを全画面表示する方法を説明していきます。

もちろんメインモニタ側に表示させることも出来ますので見ていってください。

接続されたディスプレイを取得する

対応自体はそれほど難しいことではありません。

接続されている全てのディスプレイ情報を取得して、”Primary”(プライマリ)かどうかを見れば良いです。
Primaryが第1モニタなので、今回の場合だとノートPCのディスプレイとなります。当然ながら、Primaryでない方が第2モニタで外部モニタ側となります。

※Windowsのタスクバーが表示され、タスクアイコンも表示されている側がPrimaryとなります。

ソースコード

サンプルソースは、空フォームを呼び出し、その中でシステムから全てのディスプレイ情報を取得しています。
実際に使う際には、画面を表示する前、もしくはスプラッシュ画面を出しておくなどして、ディスプレイ情報を判定すれば良いと思います。

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();

        // 実際に表示したい画面のインスタンス
        var mainWindow = new Window2();
        // システムからディスプレイ情報を取得
        foreach (var screen in System.Windows.Forms.Screen.AllScreens)
        {
            // プライマリ画面かどうかチェック
            if (!screen.Primary)
            {
                mainWindow.Topmost = true;
                mainWindow.Left = screen.Bounds.Left;
                mainWindow.Top = screen.Bounds.Top;
                mainWindow.Show();
                // 全画面表示
                mainWindow.WindowState = System.Windows.WindowState.Maximized;
            }
        }
        // 空フォームを閉じる
        this.Close();
    }
}

Primaryプロパティはbool型で、第1モニタの場合 “True” となります。

モニタが判別できたら、Boundsからディスプレイのサイズ、座標を取得します。

第2モニタはデフォルトでは右側に並びますが、Windowsの設定を変更して左側に配置している場合には、ここで取得できる座標情報はマイナス座標となります。
取得した値をそのまま使うので、それほど気にすることはありません。

モニタの左上が起点となるのでLeft, Top のプロパティを設定し、その位置からmainWindowをShow()してあげると第2モニタ側に無事表示されます。

最後の1文は、全画面表示するおまじないです。

ポイント

XAML内でWindowState=”Maximized”を指定しておくと期待する動作にならないので注意が必要です。

必ず、Show()した後でMaximaizedを指定しましょう。

また、XAML内でWindowStartupLocation=”CenterScreen”を指定していると、マウスカーソルがいるディスプレイに表示されてしまうので、これまた注意しましょう。

コメント

タイトルとURLをコピーしました