Как отключить кнопку Свернуть в C#?

в моем приложении мне нужно временно отключить кнопку минимизации основной формы. Есть идеи, как этого достичь? Я не против делать P / вызывает DLL Win32.

Edit: серый цвет кнопки минимизации будет предпочтительным решением, но есть ли другой способ предотвратить минимизацию формы?

8 ответов


Я прочитал ваш комментарий в отношении моего ответа и смог найти для вас более полное решение. Я пробежал это быстро, и, казалось, у него было поведение, которое вы хотели. Вместо получения winforms из формы, производные от этого класса:


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);
        }
    }
}

дополнительные сведения об этом уведомлении см. В разделе the MSDN статья об этом.


form.MinimizeBox = false;

или если в области форма

MinimizeBox = false;

просто сделайте MinimizeBox = false; в коде вашей формы.


поместите этот код в событие изменения размера формы:

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

это сделает вашу форму не минимизируемой (отказ от ответственности: я не выступаю за изменение стандартного поведения windows таким образом).


вы также можете реализовать дескриптор события Minimize для отмены команды


Не надо. Не трогай мои окна. Они мои, не твои. Это мой компьютер, и если я хочу свести к минимуму, я должен быть в состоянии. Я не могу придумать и никогда не получал хорошей причины для этого.


ответ Coincoin правильный. MinimizeBox также доступен в качестве свойства в окне свойств конструктора.

@Kevin: хотя я ценю настроение, это не всегда правильный ответ. Если приложение отображает модальное диалоговое окно, создавая новый экземпляр формы и вызывая его.ShowDialog () на нем вы не хотите, чтобы пользователь минимизировал эту форму, потому что тогда все входные данные в основном потоке пользовательского интерфейса блокируются до тех пор, пока модальный статус этой формы не будет удовлетворен. Пользователь потенциально можно нажать на основную форму и просто получить "динь-динь-динь" невосприимчивый звук из окон и не знать, что делать.


просто установите свойство MinimizeBox вашей формы в false. это отключит кнопку Свернуть, но другие кнопки останутся функциональными.