6

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

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

4

8 回答 8

11

我阅读了您对我的回复的评论,并能够为您提供更完整的解决方案。我跑得很快,它似乎有你想要的行为。不要从 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 文章

于 2008-11-26T09:28:58.093 回答
10
form.MinimizeBox = false;

或者如果在表单范围内

MinimizeBox = false;
于 2008-11-25T22:37:48.330 回答
1

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

于 2008-11-25T22:38:35.130 回答
1

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

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

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

于 2008-11-25T22:58:47.087 回答
0

您还可以实现对 Minimize 事件的句柄以取消命令

于 2008-11-25T22:56:46.513 回答
0

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

于 2008-11-25T23:02:45.957 回答
0

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

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

于 2008-11-25T23:11:19.840 回答
0

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

于 2015-05-28T11:52:38.223 回答