【问题标题】:How to disable the minimize button in C#?如何在 C# 中禁用最小化按钮?
【发布时间】:2008-11-25 22:30:05
【问题描述】:

在我的应用程序中,我需要暂时灰显主窗体的最小化按钮。有什么想法可以实现吗?我不介意对 Win32 dll 执行 p/invokes。

编辑:将最小化按钮变灰是首选解决方案,但是还有其他方法可以防止表单最小化吗?

【问题讨论】:

    标签: c# winforms minimize


    【解决方案1】:

    我阅读了您对我的回复的评论,并且能够为您提供更完整的解决方案。我跑得很快,它似乎有你想要的行为。不要从 Form 派生您的 winform,而是从此类派生:

    
    using System;
    using System.Windows.Forms;
    using System.ComponentModel;
    
    namespace NoMinimizeTest
    {
        public class MinimizeControlForm : Form
        {
            private const int WM_SYSCOMMAND = 0x0112;
            private const int SC_MINIMIZE = 0xf020;
    
            protected MinimizeControlForm()
            {
                AllowMinimize = true;
            }
    
            protected override void WndProc(ref Message m)
            {
                if (!AllowMinimize)
                {
                    if (m.Msg == WM_SYSCOMMAND)
                    {
                        if (m.WParam.ToInt32() == SC_MINIMIZE)
                        {
                            m.Result = IntPtr.Zero;
                            return;
                        }
                    }
                }
                base.WndProc(ref m);
            }
    
            [Browsable(true)]
            [Category("Behavior")]
            [Description("Specifies whether to allow the window to minimize when the minimize button and command are enabled.")]
            [DefaultValue(true)]
            public bool AllowMinimize
            {
                get;
                set;
            }
        }
    }
    

    如果您希望能够决定是否允许在发送点击时最小化,您可以做更多的事情,例如:

    
    using System;
    using System.Windows.Forms;
    using System.ComponentModel;
    
    namespace NoMinimizeTest
    {
        public class MinimizeControlForm : Form
        {
            private const int WM_SYSCOMMAND = 0x0112;
            private const int SC_MINIMIZE = 0xf020;
    
            protected MinimizeControlForm()
            {
    
            }
    
            protected override void WndProc(ref Message m)
            {
                if (m.Msg == WM_SYSCOMMAND)
                {
                    if (m.WParam.ToInt32() == SC_MINIMIZE && !CheckMinimizingAllowed())
                    {
                        m.Result = IntPtr.Zero;
                        return;
                    }
                }
                base.WndProc(ref m);
            }
    
            private bool CheckMinimizingAllowed()
            {
                CancelEventArgs args = new CancelEventArgs(false);
                OnMinimizing(args);
                return !args.Cancel;
            }
    
            [Browsable(true)]
            [Category("Behavior")]
            [Description("Allows a listener to prevent a window from being minimized.")]
            public event CancelEventHandler Minimizing;
    
            protected virtual void OnMinimizing(CancelEventArgs e)
            {
                if (Minimizing != null)
                    Minimizing(this, e);
            }
        }
    }
    

    有关此窗口通知的更多信息,请参阅MSDN article about it

    【讨论】:

      【解决方案2】:
      form.MinimizeBox = false;
      

      或者如果在表单范围内

      MinimizeBox = false;
      

      【讨论】:

      • 这会隐藏最小化框,但不会变灰。
      • 嗯,奇怪。我测试了它,它变灰了。它还在那里,半透明,你不能点击它。
      • 取决于您的 Windows 主题。如果启用了最小化按钮,您将获得一张图像。如果禁用,您将获得不同的图像。该图像可能什么都不是,因此您甚至看不到灰色按钮。
      • 按钮变灰(禁用)。
      【解决方案3】:

      只要做 MinimizeBox = false;在表单的代码中。

      【讨论】:

        【解决方案4】:

        将此代码放入表单的 Resize 事件中:

        if (this.WindowState == FormWindowState.Minimized)
        {
            this.WindowState = FormWindowState.Normal;
        }
        

        这将使您的表单无法最小化(免责声明:我不提倡以这种方式更改窗口的标准行为)。

        【讨论】:

          【解决方案5】:

          你也可以实现最小化事件的句柄来取消命令

          【讨论】:

            【解决方案6】:

            不要。不要乱弄我的窗户。它们是我的,不是你的。这是我的电脑,如果我想最小化,我应该可以。我想不出,也从未得到过这样做的充分理由。

            【讨论】:

            • 我打算用“核电站核心监控软件”。如果作者想让那个窗口不可最小化,我没问题。
            • 直到监控软件显示所有红线并且“紧急关闭”按钮位于监控软件窗口后面
            • 看在上帝的份上,不要将 C# WinForms 用于核电站!
            【解决方案7】:

            Coincoin 的答案是正确的。 MinimizeBox 也可用作设计器属性窗口中的属性。

            @Kevin:虽然我很欣赏这种情绪,但这并不总是一个有效的答案。如果应用程序通过创建 Form 的新实例然后在其上调用 .ShowDialog() 来显示模态对话框,则您不希望用户最小化该 Form,因为主 UI 线程上的所有输入都被阻塞,直到满足 Form 的模态状态。用户可能会单击主窗体,然后从 Windows 中获得“叮叮叮”的无响应声音,并且不知道该怎么做。

            【讨论】:

            • 将 MinimizeBox 设置为 false 通常就足够了,但在我的情况下,MaximizeBox 也被隐藏了。当 MinimizeBox 显示时,工具栏呈现 3 个按钮 - 最小化、变灰最大化、关闭。但是当将 MinimizeBox 设置为 false 时,将不再呈现最小化/最大化按钮。
            • 或者他们可能需要查看模态表单后面的一条信息来填写它,并希望将其最小化以更好地查看该信息。另外,由于新手程序员可能会看到这个问题,所以我想向他们提出这个建议。
            【解决方案8】:

            只需将表单的 MinimizeBox 属性设置为 false。 这将禁用最小化按钮,但其他按钮将保持功能。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-10-17
              • 1970-01-01
              • 2017-11-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多