如何在窗体不可见时修改WindowState

时间:2017-04-20 16:54:56

标签: c# winforms

我希望能够在WindowState=Normal时设置Visible == false,但单步执行代码会在设置Maximized后立即重置为Visibility = true

这是重现行为的最小样本。实际的任务是点击最大化表单上的按钮并让它恢复'在没有先恢复然后调整大小和重新定位的情况下,使用与RestoreBounds不同的位置和大小。它在视觉上分散注意力。当然,它可以很好地通过注释掉的可见性变化。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.Visible = false;
        this.WindowState = FormWindowState.Normal;
        this.Visible = true;
    }
}
  1. 运行应用
  2. 最大化表格
  3. 点击按钮
  4. 表单会闪烁但仍会最大化。我尝试使用SetDesktopBoundsShow手动设置边界Refresh,甚至在visible = true调用上使用BeginInvoke,以确保基础消息泵有机会处理。

1 个答案:

答案 0 :(得分:2)

你正在与Windows本地工作方式进行斗争。 Winforms不遗余力地使它像一样像WindowState和Visible是单独的属性,但它们并不在幕后。只需要一次winapi调用来改变这两种情况,最后一次胜利不可避免。

这可以通过自己制作winapi电话来修补。像这样:

    private void button1_Click(object sender, EventArgs e) {
        this.Visible = false;
        ShowWindow(this.Handle, SW_SHOWNORMAL);
        this.WindowState = FormWindowState.Normal;
        this.Visible = true;
    }

修改Click事件处理程序:

{{1}}

你想做什么。虽然属性赋值现在看起来多余,但保留它们并确保它们与您传递的ShowWindow()参数匹配非常重要。属性设置器更改了一些内部标志,用于保持Visible和WindowState不相关的错觉。我不能保证这个黑客不会造成麻烦。