在辅助显示器上全屏显示

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

Solutions Collecting From Web of "在辅助显示器上全屏显示"

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

看到这个codeproject文章。

在那里的代码将工作,但默认为您的主监视器。 要改变这一点,你需要将调用GetSystemMetrics将调用GetMonitorInfo 。 使用GetMonitorInfo,你可以得到适当的RECT传递给SetWindowPos。

GetMonitorInfo允许您获取任何显示器的RECT。

有一个在多监视器设置位置应用程序的MSDN文章可能有助于解释一些更好的东西。

对于WPF应用程序看这个帖子 。 最终取决于WindowState何时被设置为最大化。 如果在XAML或窗口构造函数中(即在窗口加载之前)设置它,它将始终在主显示上最大化。 另一方面,如果在加载窗口时将WindowState设置为最大化,则会在之前将其最大化的屏幕上最大化。

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

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

用辅助显示器上的任何辅助坐标代替

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

如果以后,对于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回答了这个问题 。

在WPF中:设置正常(不是最大限度)的WindowState属性,并创建事件加载。 在事件中写下这段代码:

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