在当前屏幕上最大化WPF窗口

我有一个无窗口的WPF应用程序,无论何时将窗口状态设置为最大化,都会在主显示屏上最大化它。

我想要做的就是使应用程序正在运行的最大化。

所以任何想法,我会做这个?

我现在的代码只是

private void titleBarThumb_MouseDoubleClick(object sender, MouseButtonEventArgs e) { if (this.WindowState == System.Windows.WindowState.Normal) { this.WindowState = System.Windows.WindowState.Maximized; } else { this.WindowState = System.Windows.WindowState.Normal; } } 

我在我的MainWindow(第一个控件)构造函数中包含这一行:

 Application.Current.MainWindow.WindowState = WindowState.Maximized; 

由于任务栏,您应该使用用户工作区的大小:

 this.Width=SystemParameters.WorkArea.Width; this.Height=SystemParameters.WorkArea.Height; 

你可以在视图的构造函数中使用它

有7个问题值得一个正确的答案。 :d

使用这个窗口,而不是正常的窗口,然后Maxmize / Minimize / normalize将自己照顾。

 using System; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Interop; public partial class MyWindow : Window { public MyWindow () { this.InitializeComponent(); this.SourceInitialized += this.OnSourceInitialized; } #endregion #region Methods private static IntPtr WindowProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { switch (msg) { case 0x0024: WmGetMinMaxInfo(hwnd, lParam); handled = true; break; } return (IntPtr)0; } private static void WmGetMinMaxInfo(IntPtr hwnd, IntPtr lParam) { var mmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO)); // Adjust the maximized size and position to fit the work area of the correct monitor IntPtr monitor = MonitorFromWindow(hwnd, (int)MonitorFromWindowFlags.MONITOR_DEFAULTTONEAREST); if (monitor != IntPtr.Zero) { var monitorInfo = new MONITORINFO(); GetMonitorInfo(monitor, monitorInfo); RECT rcWorkArea = monitorInfo.rcWork; RECT rcMonitorArea = monitorInfo.rcMonitor; mmi.ptMaxPosition.x = Math.Abs(rcWorkArea.Left - rcMonitorArea.Left); mmi.ptMaxPosition.y = Math.Abs(rcWorkArea.Top - rcMonitorArea.Top); mmi.ptMaxSize.x = Math.Abs(rcWorkArea.Right - rcWorkArea.Left); mmi.ptMaxSize.y = Math.Abs(rcWorkArea.Bottom - rcWorkArea.Top); } Marshal.StructureToPtr(mmi, lParam, true); } private void OnSourceInitialized(object sender, EventArgs e) { var window = sender as Window; if (window != null) { IntPtr handle = (new WindowInteropHelper(window)).Handle; HwndSource.FromHwnd(handle).AddHook(WindowProc); } } } 

DLL导入和声明

 [StructLayout(LayoutKind.Sequential)] public struct MINMAXINFO { public POINT ptReserved; public POINT ptMaxSize; public POINT ptMaxPosition; public POINT ptMinTrackSize; public POINT ptMaxTrackSize; } ; public enum MonitorFromWindowFlags { MONITOR_DEFAULTTONEAREST = 0x00000002 } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public class MONITORINFO { public int cbSize = Marshal.SizeOf(typeof(MONITORINFO)); public RECT rcMonitor; public RECT rcWork; public int dwFlags; } [StructLayout(LayoutKind.Sequential, Pack = 0)] public struct RECT { public int Left; public int Top; public int Right; public int Bottom; public static readonly RECT Empty; public int Width { get { return Math.Abs(this.Right - this.Left); } // Abs needed for BIDI OS } public int Height { get { return this.Bottom - this.Top; } } public RECT(int left, int top, int right, int bottom) { this.Left = left; this.Top = top; this.Right = right; this.Bottom = bottom; } public RECT(RECT rcSrc) { this.Left = rcSrc.Left; this.Top = rcSrc.Top; this.Right = rcSrc.Right; this.Bottom = rcSrc.Bottom; } public bool IsEmpty { get { // BUGBUG : On Bidi OS (hebrew arabic) left > right return this.Left >= this.Right || this.Top >= this.Bottom; } } public override string ToString() { if (this == Empty) { return "RECT {Empty}"; } return "RECT { left : " + this.Left + " / top : " + this.Top + " / right : " + this.Right + " / bottom : " + this.Bottom + " }"; } public override bool Equals(object obj) { if (!(obj is RECT)) { return false; } return (this == (RECT)obj); } public override int GetHashCode() { return this.Left.GetHashCode() + this.Top.GetHashCode() + this.Right.GetHashCode() + this.Bottom.GetHashCode(); } public static bool operator ==(RECT rect1, RECT rect2) { return (rect1.Left == rect2.Left && rect1.Top == rect2.Top && rect1.Right == rect2.Right && rect1.Bottom == rect2.Bottom); } public static bool operator !=(RECT rect1, RECT rect2) { return !(rect1 == rect2); } } [DllImport("user32.dll", SetLastError = true)] public static extern bool GetMonitorInfo(IntPtr hMonitor, MONITORINFO lpmi); [DllImport("user32.dll", SetLastError = true)] public static extern IntPtr MonitorFromWindow(IntPtr handle, int flags); 

我不确定这是否被回答 – 我创build了一个示例应用程序

 WindowStyle = WindowStyle.None; 

我创build了一个button,并在点击处理程序做了这个 –

 WindowState = WindowState.Maximized 

我连接了窗口的MouseLeftButtonDown处理程序,

 this.MouseLeftButtonDown += new(MainWindow_MouseLeftButtonDown); private void MainWindow_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { DragMove(); } 

当我把我的窗口拖到我的第二个监视器,并点击最大化button,它在当前窗口,而不是启动窗口最大化。 我正在使用VS2010和.NET 4.让我知道这是否有帮助。

看看这个问题和答案: 如何在屏幕上中心的WPF应用程序?

您可以使用Windows.Forms.Screen中描述的函数来获取当前屏幕。 然后,也许可以将窗口StartupLocation设置到这个屏幕(尽可能最大化之前)可以实现你想要的,但是我没有花时间自己尝试一下,说实话。

我问了一个类似的问题,你可能会发现有帮助。 如何使用鼠标光标在屏幕上最大化WPF窗口?

c#应用程序首先在主显示器上启动,除非它被移动,否则您的代码将工作。 但是,如果您的wpf应用程序将被移动到另一个显示器,则可以将新的位置logging并存储在本地configuration文件中。 但是,你的应用程序将没有边界或任何其他本地控制,所以你也将不得不实施移动位。 当你的窗口被移动时,你将能够使用SystemParameters捕获显示索引。

祝你好运

加载之前,我们无法最大化窗口。 所以,通过钩住fullScreenWindow的Loaded事件并沿着以下几行处理事件:

 private void Window_Loaded(object sender, RoutedEventArgs e) { WindowState = WindowState.Maximized; } 

我遇到了同样的问题。 就我而言,事实certificate,当我完成这个任务时,我隐藏了我的popup窗口。 所以如果我下次打电话给它,并要求它最大化,它会在原来的屏幕上。 一旦我开始closures它,它开始在适当的屏幕上最大化。