C#以编程方式取消最小化

如何获取当前最小化的表单并将其还原到以前的状态。 我找不到任何方法来确定它以前的WindowStateNormal还是Maximized ; 但我知道信息必须存储在某处,因为Windows在任务栏上使用应用程序时没有问题。

没有托管API。 这样做的方法是PInvoke GetWindowPlacement并检查WPF_RESTORETOMAXIMIZED

有关详细信息,请参阅此Microsoft How To (在VB中演示该技术)。

在C#中,这将是:

 [DllImport("user32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl); private struct WINDOWPLACEMENT { public int length; public int flags; public int showCmd; public System.Drawing.Point ptMinPosition; public System.Drawing.Point ptMaxPosition; public System.Drawing.Rectangle rcNormalPosition; } public void RestoreFromMinimzied(Form form) { const int WPF_RESTORETOMAXIMIZED = 0x2; WINDOWPLACEMENT placement = new WINDOWPLACEMENT(); placement.length = Marshal.SizeOf(placement); GetWindowPlacement(form.Handle, ref placement); if ((placement.flags & WPF_RESTORETOMAXIMIZED) == WPF_RESTORETOMAXIMIZED) form.WindowState = FormWindowState.Maximized; else form.WindowState = FormWindowState.Normal; } 
  this.WindowState = FormWindowState.Normal; 

你还有:

  this.WindowState = FormWindowState.Minimized; this.WindowState = FormWindowState.Maximized; 

啊,我误解了这个问题:

从Minimized恢复WindowState应该是您正在寻找的。 它说你可以像这样模仿任务栏的行为:

 SendMessage(form.Handle, WM_SYSCOMMAND, SC_RESTORE, 0); 

您可以通过Resize事件跟踪窗口状态更改。 像这样:

 public partial class Form1 : Form { public Form1() { InitializeComponent(); prevState = currState = this.WindowState; } protected override void OnResize(EventArgs e) { if (currState != this.WindowState) { prevState = currState; currState = this.WindowState; } base.OnResize(e); } private FormWindowState prevState, currState; } 

如果你想在每次更改时存储以前的状态(最大化/最小化),你必须根据MSDN上的这篇文章挂钩SizeChanged事件。 您可以在那里获取WindowState并存储它。