【问题标题】:Check if currently minimized window was in maximized or normal state at the time of minimization检查当前最小化的窗口在最小化时是否处于最大化或正常状态
【发布时间】:2016-09-07 09:13:28
【问题描述】:

如何区分当前最小化的窗口是否在此之前最大化,而不是 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,但如果窗口在关闭时被最小化,我不希望它在下一次开始最小化应用程序启动(这是目前的答案)。

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

【问题讨论】:

  • 你可以在WndProc方法里面检查表单是否被最小化,看看this

标签: c# winforms window-position


【解决方案1】:

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 你的正确答案太简短了。来自 MSDN:“在 WM_SYSCOMMAND 消息中,wParam 参数的四个低位由系统内部使用。为了在测试 wParam 的值时获得正确的结果,应用程序必须将值 0xFFF0 与 wParam 组合使用按位 AND 运算符计算值。"
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多