【问题标题】:How to detect when a windows form is being minimized?如何检测窗口窗体何时被最小化?
【发布时间】:2010-11-06 09:04:24
【问题描述】:

我知道我可以通过 WindowState 获取当前状态,但我想知道当用户尝试最小化表单时是否会触发任何事件。

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    您可以使用 Resize 事件并检查事件中的 Forms.WindowState 属性。

    private void Form1_Resize ( object sender , EventArgs e )
    {
        if ( WindowState == FormWindowState.Minimized )
        {
            // Do some stuff
        }
    }
    

    【讨论】:

    • 请注意,这似乎是Exceptions can be swallowed 的地方之一。
    • 你还需要 this.Resize += new System.EventHandler(this.Form1_Resize);
    【解决方案2】:

    要进入之前表单已最小化,您必须挂钩到 WndProc 过程:

        private const int WM_SYSCOMMAND = 0x0112;
        private const int SC_MINIMIZE = 0xF020; 
    
        [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
        protected override void WndProc(ref Message m)
        {
            switch(m.Msg)
            {
                case WM_SYSCOMMAND:
                    int command = m.WParam.ToInt32() & 0xfff0;
                    if (command == SC_MINIMIZE)
                    {
                        // Do your action
                    }
                    // If you don't want to do the default action then break
                    break;
            }
            base.WndProc(ref m);
        }
    

    如其他答案指出的那样, 表单已最小化挂钩到 Resize 事件后做出反应(为了完整性而包含在此处):

    private void Form1_Resize (object sender, EventArgs e)
    {
        if (WindowState == FormWindowState.Minimized)
        {
            // Do your action
        }
    }
    

    【讨论】:

    • 0xF030 是从正常窗口状态最大化时。 0xF120 是从窗口栏最大化时
    • 其实这只捕获了Minimize Click事件!您正在寻找的是 WM_SIZE (0x0005) & SIZE_MINIMIZED (1)
    【解决方案3】:

    我不知道特定事件,但是当表单最小化时会触发Resize事件,您可以在该事件中检查FormWindowState.Minimized

    【讨论】:

    • 这与私有“lastState”标志相结合是最简单的方法。
    【解决方案4】:

    对于搜索 WPF 窗口最小化事件的人:

    这有点不同。对于回调使用 WindowState :

    private void Form1_Resize(object sender, EventArgs e)
    {
        if (WindowState == FormWindowState.Minimized)
        {
            // Do some stuff
        }
    }
    

    要使用的事件是 StateChanged(而不是 Resize):

    public Main()
    {
        InitializeComponent();
        this.StateChanged += Form1_Resize;
    }
    

    【讨论】:

      猜你喜欢
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-21
      • 2018-11-20
      • 1970-01-01
      • 2020-10-01
      相关资源
      最近更新 更多