2008-11-25 23 views
6

En mi aplicación, necesito oscurecer temporalmente el botón de minimizar del formulario principal. ¿Alguna idea de cómo se puede lograr esto? No me importa hacer p/invocaciones a Win32 dlls.Cómo deshabilitar el botón minimizar en C#?

Editar: La solución preferida es oscilar el botón minimizar, pero ¿hay alguna otra forma de evitar que la forma se minimice?

Respuesta

11

He leído su comentario con respecto a mi respuesta y pude obtener una solución más completa para usted. Ejecuté esto rápidamente y parecía tener el comportamiento que deseabas. En lugar de derivar sus winforms, en el formulario, se derivan de esta clase:


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

Se podría hacer un poco más si desea ser capaz de decidir si permite reducir al mínimo en el momento de enviar el clic, por ejemplo:


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

Para obtener más información acerca de esta notificación de ventana, consulte el MSDN article about it.

10
form.MinimizeBox = false; 

o si en el ámbito forma

MinimizeBox = false; 
+0

Esto oculta el cuadro de minimizar, pero no lo atenúa. –

+1

Hmmm, extraño. Lo probé y lo atenúa. Todavía está allí, semitransparente y no puedes hacer clic en él. – Coincoin

+2

Depende del tema de Windows. Si el botón de minimizar está habilitado, obtienes una imagen. Si está deshabilitado, obtienes una imagen diferente. Esa imagen podría no ser nada, por lo que ni siquiera ves un botón desplegable. – Eyal

1

Sólo hacer MinimizeBox = false; en el código de tu formulario.

0

También puede poner en práctica asa para el evento Minimizar para cancelar el comando

+0

Eso funcionaría si hubiera tal evento. :) – MusiGenesis

1

Pon este código en el cambio de tamaño de sucesos del formulario:

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

Esto hará que su forma no minimizable (Disclaimer: no defiende alterar el comportamiento estándar de Windows de esta manera).

0

No. No te metas con mis ventanas. Ellos son míos, no tuyos. Es mi computadora y si quiero minimizarla, debería ser capaz de hacerlo. No puedo pensar, y nunca me han dado, una buena razón para hacer esto.

+7

Voy a ir con "software de monitoreo central de la planta de energía nuclear".Si el autor quiere que esa ventana no se minimice, estoy de acuerdo. – MusiGenesis

+4

hasta que el software de monitoreo muestre todo el revestimiento rojo y el botón de "apagado de emergencia" se encuentre detrás de la ventana del software de monitoreo – Kevin

+8

¡Por el amor de Dios, no use C WinForms para centrales nucleares! –

0

La respuesta de Coincoin es correcta. MinimizeBox también está disponible como una propiedad en la ventana de propiedades del diseñador.

@Kevin: Aunque aprecio el sentimiento, esa no siempre es una respuesta válida. Si la aplicación muestra un cuadro de diálogo modal creando una nueva instancia de un Formulario y luego llamando a .ShowDialog(), no desea que el usuario minimice ese Formulario, porque entonces todas las entradas en el subproceso principal de la interfaz de usuario están bloqueadas hasta el estado modal de ese formulario está satisfecho. El usuario podría hacer clic en el formulario principal y obtener el sonido "no molesto" de Windows y no saber qué hacer.

+0

Establecer MinimizeBox en falso normalmente sería suficiente, pero en mi caso, MaximizeBox también está oculto. Cuando se muestra MinimizeBox, la barra de herramientas representa 3 botones: minimizar, atenuar, maximizar, cerrar. Pero cuando cuando se establece MinimizeBox en falso, los botones minimizar/maximizar ya no se representan. –

+0

o podrían necesitar ver un fragmento de información detrás del formulario modal para completarlo y querer minimizarlo para ver mejor esa información. Además, dado que esta pregunta puede ser vista por programadores novatos, quería poner estos consejos allí para ellos. – Kevin

0

simplemente establezca la propiedad MinimizeBox de su formulario en falso. esto desactivará el botón de minimizar, pero otros botones permanecerán funcionales.

Cuestiones relacionadas