在辅助监视器上全屏显示

时间:2009-04-15 20:27:25

标签: .net wpf windows fullscreen multiple-monitors

如何编写dotNet Windows(或WPF)应用程序以使其在辅助监视器上全屏显示?

7 个答案:

答案 0 :(得分:33)

将窗口最大化到辅助监视器(如果有)的扩展方法。 不假设辅助监视器是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;
            }
        }
    }
}

答案 1 :(得分:9)

对于WPF应用,请查看this post。最终,它取决于WindowState何时设置为最大化。如果您在XAML或窗口构造函数中设置它(即在加载窗口之前),它将始终最大化到主显示器上。另一方面,如果在加载窗口时将WindowState设置为Maximized,它将在之前最大化的屏幕上最大化。

答案 2 :(得分:7)

请参阅this codeproject article.

其中的代码可以使用,但默认为主监视器。要更改此设置,您需要将对GetSystemMetrics的调用替换为GetMonitorInfo。使用GetMonitorInfo,您可以获得适当的RECT以传递给SetWindowPos。

GetMonitorInfo允许您获取任何监视器的RECT。

MSDN Article on Position Apps in Multi-Monitor Setups可能有助于更好地解释事情。

答案 3 :(得分:6)

我注意到一个主张在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;
}

替换辅助显示器上的任何配件

答案 4 :(得分:5)

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;
}

答案 5 :(得分:0)

从您的问题中不清楚您是否正在寻找一种方法将窗口移动到辅助显示器然后全屏显示,或者如果您只是想在窗口所在的任何监视器上支持全屏模式(可能是小学或中学)。

如果稍后,对于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);
    }

在当前问题中,Pavel获得了基于表单的答案,并且在this question中获得了他对Nir的回答。

答案 6 :(得分:-1)

在WPF中:在Normal(不是Maximixed)中设置WindowState属性并创建事件Loaded。在这个事件中写这个代码:

this.Left = SystemParameters.PrimaryScreenWidth + 100;
this.WindowState = System.Windows.WindowState.Maximized;