dotNet Windows(またはWPF)アプリケーションをプログラムして、セカンダリモニターでフルスクリーンにする方法を教えてください。
7 に答える
ウィンドウをセカンダリ モニターに最大化する拡張メソッド (存在する場合)。セカンダリ モニターが System.Windows.Forms.Screen.AllScreens[2] であるとは想定していません。
using System.Linq;
using System.Windows;
namespace ExtendedControls
{
static public class WindowExt
{
// NB : Best to call this function from the windows Loaded event or after showing the window
// (otherwise window is just positioned to fill the secondary monitor rather than being maximised).
public static void MaximizeToSecondaryMonitor(this Window window)
{
var secondaryScreen = System.Windows.Forms.Screen.AllScreens.Where(s => !s.Primary).FirstOrDefault();
if (secondaryScreen != null)
{
if (!window.IsLoaded)
window.WindowStartupLocation = WindowStartupLocation.Manual;
var workingArea = secondaryScreen.WorkingArea;
window.Left = workingArea.Left;
window.Top = workingArea.Top;
window.Width = workingArea.Width;
window.Height = workingArea.Height;
// If window isn't loaded then maxmizing will result in the window displaying on the primary monitor
if ( window.IsLoaded )
window.WindowState = WindowState.Maximized;
}
}
}
}
WPFアプリについては、この投稿を参照してください。最終的には、WindowStateがMaximizedに設定されているかどうかによって異なります。XAMLまたはウィンドウコンストラクターで(つまり、ウィンドウが読み込まれる前に)設定すると、常にプライマリディスプレイに最大化されます。一方、ウィンドウのロード時にWindowStateをMaximizedに設定すると、以前に最大化された画面で最大化されます。
Loaded イベントで位置を設定することを提唱する回答に気付きましたが、これにより、ウィンドウが最初に通常表示されてから最大化されたときにちらつきが発生します。コンストラクターで SourceInitialized イベントをサブスクライブし、そこに位置を設定すると、ちらつきのないセカンダリ モニターへの最大化が処理されます。ここでは WPF を想定しています。
public MyWindow()
{
SourceInitialized += MyWindow_SourceInitialized;
}
void MyWindow_SourceInitialized(object sender, EventArgs e)
{
Left = 100;
Top = 50;
Width = 800;
Height = 600;
WindowState = WindowState.Maximized;
}
セカンダリ モニターのいずれかを座標に置き換えます
このコードプロジェクトの記事を参照してください。
そこにあるコードは機能しますが、デフォルトでプライマリ モニターに設定されます。これを変更するには、 GetSystemMetrics の呼び出しをGetMonitorInfoの呼び出しに置き換える必要があります。GetMonitorInfo を使用すると、適切な RECT を取得して SetWindowPos に渡すことができます。
GetMonitorInfo を使用すると、任意のモニターの RECT を取得できます。
マルチモニター設定での位置アプリに関する MSDN の記事があり、物事をよりよく説明するのに役立つ場合があります。
private void Form1_Load(object sender, EventArgs e)
{
this.FormBorderStyle = FormBorderStyle.None;
this.Bounds = GetSecondaryScreen().Bounds;
}
private Screen GetSecondaryScreen()
{
foreach (Screen screen in Screen.AllScreens)
{
if (screen != Screen.PrimaryScreen)
return screen;
}
return Screen.PrimaryScreen;
}
ウィンドウをセカンダリモニターに移動してからフルスクリーンにする方法を探しているのか、それともウィンドウがオンになっているモニター(プライマリまたはセカンダリの可能性がある)でフルスクリーンモードをサポートしたいだけなのか、あなたの質問からは明らかではありません)。
後者の場合、WPF ウィンドウの場合、フルスクリーン モードとまったく同じではありませんが、最大化されているときに境界線を削除し、最大化されていないときに境界線を復元できます。モニターなどを確認する必要はありません。キャプション/タイトル バーの表示は、境界線の状態によって制御されます。
protected override void OnStateChanged(EventArgs e)
{
if (WindowState == WindowState.Maximized)
{
if (WindowStyle.None != WindowStyle)
WindowStyle = WindowStyle.None;
}
else if (WindowStyle != WindowStyle.SingleBorderWindow)
WindowStyle = WindowStyle.SingleBorderWindow;
base.OnStateChanged(e);
}
クレジットは、現在の質問での Forms ベースの回答については Pavel に、この質問での回答については Nir に与えられます。
WPF の場合: WindowState プロパティを Normal (Maxixed ではなく) に設定し、Loaded イベントを作成します。イベントでは、次のコードを記述します。
this.Left = SystemParameters.PrimaryScreenWidth + 100;
this.WindowState = System.Windows.WindowState.Maximized;