Domanda

Nella mia applicazione ho bisogno di disattivare temporaneamente il pulsante di riduzione a icona del modulo principale. Qualche idea su come raggiungere questo obiettivo? Non mi dispiace fare p / invoke a Win32 dlls.

Modifica: selezionare il pulsante di minimizzazione sarebbe la soluzione preferita, ma esiste un altro modo per impedire che il modulo venga ridotto a icona?

È stato utile?

Soluzione

Ho letto il tuo commento in merito alla mia risposta e sono stato in grado di trovare una soluzione più completa per te. Ho corso in fretta e sembrava avere il comportamento che volevi. Invece di derivare le tue forme di win da Form, deriva da questa classe:


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

Potresti fare un po 'di più se volessi essere in grado di decidere se consentire la minimizzazione al momento dell'invio del clic, ad esempio:


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

Per ulteriori informazioni su questa notifica della finestra, vedere articolo MSDN al riguardo .

Altri suggerimenti

form.MinimizeBox = false;

o se nell'ambito del modulo

MinimizeBox = false;

Basta minimizzareBox = false; nel codice del tuo modulo.

Inserisci questo codice nell'evento di ridimensionamento del tuo modulo:

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

Questo renderà il tuo modulo non minimizzabile (ESCLUSIONE DI RESPONSABILITÀ: non propongo di modificare in questo modo il comportamento standard di Windows).

È inoltre possibile implementare handle per l'evento Riduci a icona per annullare il comando

Non farlo. Non scherzare con le mie finestre. Sono miei, non tuoi. È il mio computer e se voglio minimizzare, dovrei essere in grado di farlo. Non riesco a pensare e non mi è mai stato dato un buon motivo per farlo.

La risposta di Coincoin è corretta. MinimizeBox è anche disponibile come proprietà nella finestra delle proprietà del designer.

@Kevin: anche se apprezzo il sentimento, questa non è sempre una risposta valida. Se l'applicazione visualizza una finestra di dialogo modale creando una nuova istanza di un modulo e quindi chiamando .ShowDialog () su di esso, non si desidera che l'utente riduca al minimo tale modulo, poiché quindi tutti gli input nel thread dell'interfaccia utente principale vengono bloccati fino a quando lo stato modale di Form è soddisfatto. L'utente potrebbe potenzialmente fare clic sul modulo principale e ottenere semplicemente " ding ding ding " suono non rispondente da Windows e non so cosa fare.

è sufficiente impostare la proprietà MinimizeBox del modulo su false. questo disabiliterà il pulsante minimizza ma altri pulsanti rimarranno funzionali.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top