C#编程:以编程方式最小化窗体

10

如何将当前最小化的窗体恢复到先前的状态。我找不到任何方法来确定它以前的 WindowStateNormal 还是 Maximized;但我知道信息必须存储在某个地方,因为 Windows 在任务栏上对于应用程序执行此操作没有问题。


我不想浪费任何人的时间来尝试重新打开这个问题;但是所谓的重复问题并没有回答我的问题,因为它的答案将始终恢复到正常状态(打开但非最大化状态),包括如果在最大化状态下预先最小化。 - Dan Is Fiddling By Firelight
4个回答

11

这方面没有托管 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;
}

@Dan:谢谢 - 我已经修复了错误 - (我是边打边输入的,而且是从pinvoke.net上复制的,那里的ref/out问题是错误的...) - Reed Copsey
1
@Dan:听起来这对你有用,至少看起来是这样的 ;) - Reed Copsey

10
 this.WindowState = FormWindowState.Normal;

你还有:

 this.WindowState = FormWindowState.Minimized;
 this.WindowState = FormWindowState.Maximized;
啊,我误解了这个问题: 从最小化状态恢复窗口状态应该是你正在寻找的。它说你可以像这样模拟任务栏的行为:
SendMessage(form.Handle, WM_SYSCOMMAND, SC_RESTORE, 0);

2
那并没有回答他的问题 - 他在问如果窗体当前最小化,是去正常模式还是最大化模式... - Reed Copsey
我更新了我的回答。我误解了问题。 - Chuck Callebs
这是一个更加简洁的解决方案 - 实现起来非常简单。 - Chris Ostler

3
您可以通过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;
}

2

如果您想在更改窗口状态(最大化/最小化)时存储先前的状态,您需要钩取SizeChanged事件,根据MSDN上的帖子。您可以在那里获取WindowState并将其存储。


1
有比自己存储更好的选择。它已经被Windows API跟踪了。 - Reed Copsey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接