windows 在辅助监视器上全屏显示

nimxete2  于 2023-02-16  发布在  Windows
关注(0)|答案(8)|浏览(166)

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

gblwokeq

gblwokeq1#

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

sd2nnvve2#

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

zkure5ic

zkure5ic3#

我注意到一个建议在Loaded事件中设置位置的答案,但是当窗口首先正常显示然后最大化时,这会导致 Flink 。如果您订阅构造函数中的SourceInitialized事件并在其中设置位置,它将在辅助监视器上处理最大化而不 Flink -我在这里假设WPF

public MyWindow()
{
    SourceInitialized += MyWindow_SourceInitialized;
}

void MyWindow_SourceInitialized(object sender, EventArgs e)
{
    Left = 100;
    Top = 50;
    Width = 800;
    Height = 600;
    WindowState = WindowState.Maximized;
}

替换辅助监视器上的任何坐标

jtjikinw

jtjikinw4#

参见this codeproject article.
这里的代码可以工作,但是默认为主监视器。要改变这一点,你需要将对GetSystemMetrics的调用替换为对GetMonitorInfo的调用。使用GetMonitorInfo,你可以获得合适的RECT传递给SetWindowPos。
GetMonitorInfo允许您获取任何显示器的RECT。
有一个MSDN Article on Position Apps in Multi-Monitor Setups可能有助于更好地解释事情。

0kjbasz6

0kjbasz65#

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

eivgtgni6#

您的问题不清楚您是否正在寻找一种方法将窗口移动到辅助监视器,然后进入全屏模式,或者您只是希望在窗口所在的任何监视器(可能是主监视器或辅助监视器)上支持全屏模式。
如果是后者,对于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在当前问题中给出了基于表单的答案,Nir在this question中给出了答案。

mec1mxoz

mec1mxoz7#

@jay-evans的回答对我来说很有用,但是,我还需要添加WpfscreenHelperNuget包来获取屏幕信息,而不像@grantnz的回答那样依赖于旧的System.Windows.Forms名称空间。
还要注意的是,只设置尺寸(左,上,宽+高)让我在每一边都有一个小边框。只有在设置了WindowState。最大化是它,真实的的全屏效果达到。
由于我有不同DPI配置的显示器,我还不得不使用WpfWorkingArea而不是WorkingArea,因为坐标返回不正确。
为完整起见,在此发布,这是使用WPF与.NET 7.0,并确认与不同的DPI配置:

public MainWindow()
    {
        InitializeComponent();
        SourceInitialized += MainWindow_SourceInitialized;
    }

    private void MainWindow_SourceInitialized(object? sender, EventArgs e)
    {
        var screen = WpfScreenHelper.Screen.AllScreens.FirstOrDefault(s => !s.Primary);
        if (screen != null)
        {
            this.WindowState = WindowState.Normal;
            this.Left = screen.WpfWorkingArea.Left;
            this.Top = screen.WpfWorkingArea.Top;
            this.Width = screen.WpfWorkingArea.Width;
            this.Height = screen.WpfWorkingArea.Height;
            this.WindowState = WindowState.Maximized;
        }
    }
egmofgnx

egmofgnx8#

在WPF中:将WindowState属性设置为Normal(而不是Maximixed)并创建Loaded事件。在该事件中编写以下代码:

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

相关问题