【问题标题】:C# Programmatically Unminimize form [duplicate]C#以编程方式取消最小化表单[重复]
【发布时间】:2018-04-07 01:24:42
【问题描述】:

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

【问题讨论】:

  • 我不会浪费其他人的时间来尝试重新打开它;但所谓的重复没有回答我的问题,因为它的答案将始终恢复正常(打开但未最大化),包括如果预最小化它处于最大化状态。

标签: c# winforms


【解决方案1】:

没有用于此的托管 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 问题错误......)
  • @Dan:听起来这对你有用,但至少 ;)
【解决方案2】:
 this.WindowState = FormWindowState.Normal;

你还有:

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

啊,我误解了这个问题:

Restore WindowState from Minimized 应该是您要查找的内容。它说你可以像这样模仿任务栏的行为:

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

【讨论】:

  • 这并没有回答他的问题——他问的是如果表单当前被最小化,是去正常还是最大化......
  • 我更新了我的答案。我误解了这个问题。
  • 这是一个更简洁的解决方案 - 实现起来非常简单。
【解决方案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;
}

【讨论】:

    【解决方案4】:

    如果您想在发生变化时存储之前的状态(最大化/最小化),则必须根据this post on MSDN 挂钩SizeChanged 事件。您可以在那里获取WindowState 并存储它。

    【讨论】:

    • 有比自己存储更好的选择。它已被 Windows API 跟踪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    • 2011-10-01
    • 1970-01-01
    相关资源
    最近更新 更多