检查当前最小化窗口在最小化时是处于最大化状态还是正常状态

本文关键字:状态 最小化 最大化 常状态 窗口 检查 | 更新日期: 2023-09-27 18:06:04

如何区分当前最小化的窗口是否在此之前最大化,而不是c#/WinForms中的正常状态?

if (WindowState == FormWindowState.Minimized)
{
    Properties.Settings.Default.Location = RestoreBounds.Location;
    Properties.Settings.Default.Size = RestoreBounds.Size;
    Properties.Settings.Default.IsMaximized = ...; // How do I know if the window would be restored to maximized?
}

我想使用应用程序设置使我的窗口的位置和状态持久,我遵循https://stackoverflow.com/a/1876326/492336,但如果窗口在关闭时最小化,我不希望它在下一次应用程序启动时开始最小化(这就是目前的答案)。

我想要的是,如果窗口在最小化时已被最大化,则以最大化开始;如果窗口在最小化时已处于正常状态,则以正常状态开始。

检查当前最小化窗口在最小化时是处于最大化状态还是正常状态

WinForms不暴露任何WindowStateChanged事件,那么你必须自己跟踪它。当窗体状态改变时,Windows将发送一个WM_SYSCOMMAND:

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        _isMaximized = WindowState == FormWindowState.Maximized;
    }
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_SYSCOMMAND)
        {
            int wparam = m.WParam.ToInt32() & 0xfff0;
            if (wparam == SC_MAXIMIZE)
                _isMaximized = true;
            else if (wparam == SC_RESTORE)
                _isMaximized = false;
        }
        base.WndProc(ref m);
    }
    private const int WM_SYSCOMMAND = 0x0112;
    private const int SC_MAXIMIZE = 0xf030;
    private const int SC_RESTORE = 0xf120;
    private bool _isMaximized;
}

您可以在最小化窗口上使用GetWindowPlacement(本机Win32 API函数),并从WindowPlacement结构体中读取Flags成员。如果设置了0x02位,则窗口在最小化之前被最大化。

if (this.WindowState == FormWindowState.Minimized)....