检查当前最小化的窗口在最小化时是否处于最大化或正常状态。

8
我该如何在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://dev59.com/nnI-5IYBdhLWcg3wZ3fC#1876326 但是如果窗口在关闭时被最小化,我不希望它在下一次启动应用程序时继续最小化。(这是目前该答案的做法。)
我希望如果窗口在最小化时已经处于最大化状态,则在启动时窗口以最大化状态打开;如果窗口在最小化时处于正常状态,则在启动时以正常状态打开。

你可以在 WndProc 方法中检查窗体是否被最小化,参考这里 - Alessandro D'Andria
3个回答

4

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;
}

虽然这个方法可行,但您能否说明一下为什么要屏蔽WParam值?谢谢。 - Alex Essilfie
1
@alex 你说得对,答案太简洁了。来自MSDN的解释是:“在WM_SYSCOMMAND消息中,wParam参数的低四位被系统内部使用。为了在测试wParam值时获得正确的结果,应用程序必须使用按位与运算符将值0xFFF0与wParam值组合起来。” - Adriano Repetti

2
您可以在最小化的窗口上使用GetWindowPlacement(一种本地的Win32 API函数),并从WindowPlacement结构中读取Flags成员。如果设置了位0x02,则窗口在最小化之前是最大化的。"最初的回答"

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

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