Microsoft MVP

Email y Rss

email rss

Klout

Seguidores en facebook

Timeline de mi Twitter

Tienes preguntas?

Ideas de un Conejo
Más allá de los sistemas de información: (C#)=> videojuegos, soluciones a problemas interesantes y Sistemas Operativos
XNA
C#
Sistemas Operativos
Varios
Windows Phone
WinRT
XAML
Azure
HTML 5
Acerca de

C# – Como modificar el comportamiento del botón minimizar, maximizar, etc.

September 13th, 2009 by JuanK

Follow @JuanKRuiz

Para cambiar el comportamiento del botón minimizar se debe recurrir a un mecanismo pocas veces utilizado por los desarrolladores de código administrado, hay que acceder al bucle de mensajes del sistemas de ventana de ventanas, más conocido como WndProc.

En Windows Forms esta es una tarea relativamente sencilla, la cual veremos unas líneas más adelante.

 

Como sabe una ventana que se debe maximizar o minimizar?

El bucle de mensajes

Las ventanas – y los demás controles – funcionan gracias a un bucle de mensajes, todo lo que manejamos nosotros como eventos : click del mouse, mover, cerrar, cambiar tamaño, maximizar etc, realmente es controlado por un bucle en donde se envían diferentes mensajes a la ventana, esta a su vez tiene un procedimiento que recibe estos mensajes y con base a los mensajes recibidos puede hacer una u otra cosa según se programe.

 

Si, para algunos esto ya debe estar sonando a cuento, pero las cosas son así por debajo de lo que usamos tradicionalmente. El tema del artículo no es explicar como funciona un ciclo de mensajes así que por el momento lo dejaremos hasta allí y quien quiera profundizar puede consultar esta fuente en internet http://www.winprog.org/tutorial/message_loop.html

 

Por el momento lo que si nos interesa del bucle de mensajes es que algunos de esos mensajes se utilizan para maximizar y minimizar las ventanas, es decir cuando uno utiliza alguna funcionalidad para minimizar una ventana, lo que ocurre realmente es que se envía el mensaje que dice: hey! minimízate y ya el manejador de la ventana hará lo necesario para minimizarse.

Los Mensajes

Cada vez que se presiona cualquiera de los botones del marco de la ventana (maximizar, minimizar, restaurar, cerrar, etc.) o que se ejecute alguna acción sobre el menú de la ventana, el sistema mensajes envía a la ventana el mensaje WM_SYSCOMMAND, este mensaje esta definido dentro de la API de Windows de esta manera:

const int WM_SYSCOMMAND = 0x112; 

 

Este mensaje a su ves esta acompañado de un parámetro WParam el cual contiene información relevante a que acción se ha realizado con el menú o los botones de la ventana, entre estos mensajes encontramos:

const int SC_MINIMIZE     = 0xF020;
const int SC_MAXIMIZE     = 0xF030;
const int SC_CLOSE        = 0xF060;

 

WndProc en Windows Forms

Para acceder a este procedimiento desde Windows Forms basta con sobre escribir el método WndProc:

protected override void WndProc(ref Message m)
{
   base.WndProc(ref m);
}
 

Implementación

Para encajar las piezas lo que se debe hacer es preguntar dentro de WndProc acerca de que mensaje se ha recibido, si el mensaje es WM_SYSCOMMAND entonces se pregunta acerca del parámetro LParam para verificar que comando ha sido enviado, es allí donde podemos interceptar el mensaje que nos interesa.

 

Siempre es necesario llamar al código base cuando no vayamos a hacer nada con un mensaje para que de esta forma la ventana se comporte de manera normal.

const int WM_SYSCOMMAND = 0x112;
const int SC_MINIMIZE = 0xF020;

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_SYSCOMMAND)
    {
        if (m.WParam == (IntPtr)SC_MINIMIZE)
            MessageBox.Show("Hacer lo que quieras en vez de minimizar");

        base.WndProc(ref m);
    }
    else
        base.WndProc(ref m);
}
 

Para profundizar un poco más acerca de como modificar el comportamiento de las ventanas les recomiendo revisar este link: http://juank.black-byte.com/c-minimizar-maximizar-ventana-sin-borde/

 

Print Friendly

Follow @JuanKRuiz

  • 10 Comentarios »
  • Publicado en la categoría 'C#'

10 comentarios to “C# – Como modificar el comportamiento del botón minimizar, maximizar, etc. ”


  • Ideas de un Conejo Says:
    September 13th, 2009 at 12:58 pm  

    [...] Puedes ver el artículo original en mi blog: http://juank.black-byte.com/c-modificar-boton-minimizar-maximizar/ [...]

  • C#- el caso de la ventana sin borde que no se deja maximizar ni minimizar | Ideas de un Conejo Says:
    September 13th, 2009 at 1:01 pm  

    [...] http://juank.black-byte.com/c-modificar-boton-minimizar-maximizar/ [...]

  • Ideas de un Conejo Says:
    September 13th, 2009 at 1:10 pm  

    [...] http://juank.black-byte.com/c-modificar-boton-minimizar-maximizar/ [...]

  • Lousan Says:
    September 13th, 2009 at 1:25 pm  

    Hola, fantástico post.

    Una pregunta esto se puede aplicar tb al botón cerrar de las ventanas, quiero decir, que al pulsar la ‘X’ salte un mensaje pidiendo confirmación de que realmente se quiere cerrar la aplicación.

    Gracias.

  • JuanK Says:
    September 13th, 2009 at 4:36 pm  

    Hola, claro que si es posible, pero te recomiendo que uses el evento FormClsing de la forma para tal fin, alli el segundo parametro te da informacion a cerca de que forma han cerado el formulario

  • Carlos Says:
    September 28th, 2009 at 5:55 pm  

    Juan Carlos , me quede con la duda de como aplicar CreateParams al form que tengo visible. He probado lo de WinProc y me funciona pero como lo aplico
    CreateParams p = this.Createparams? lo probe pero no funciona

  • JuanK Says:
    September 28th, 2009 at 6:00 pm  

    En este link encontraras lo que necesitas:
    http://juank.black-byte.com/c-minimizar-maximizar-ventana-sin-borde/

  • Javi Says:
    October 7th, 2010 at 3:38 am  

    Buenas Juan,
    me estoy volviendo loco haciendo una aplicación de escritorio con Forms porque no consigo enlazar el evento de pulsar un botón con abrir un fichero local y meterle datos.

    Soy un poco novato en este lenguaje y no encuentro nada en la red que me ayude con mi problema. Te he escrito en este post aunque sé que no está muy relacionado con mi tema.

    Mi código de la función que se ejecuta cuando pulso el botón es ésta:

    private: System::Void Guardar_Click( Object^ sender, System::EventArgs^ e ){
    ofstream f2;
    f2.open(“C:\prueba.txt”, ofstream::out);
    if (!f2){
    cout << "fallo" << endl;
    }
    f2 << "PRUEBAAAAAAAAAAAAAA" << endl;

    MessageBox::Show( "Ha seleccionado a los siguientes publicadores:\npepe\npaco %s", "Aviso de Configuración",MessageBoxButtons::OK, MessageBoxIcon::Information);
    f2.close();
    }

    El MensageBox me sale sin problemas, pero no veo que en mi fichero ocurra nada…

    ¿Podrías darme alguna pistilla al respecto?

    Gracias de antemano!!

  • Irving Says:
    April 4th, 2011 at 3:12 pm  

    y para por ejemplos SC_RESTORE cual seria el valor?

  • domingo Says:
    September 28th, 2012 at 5:08 pm  

    gracias por la ayuda me sirvio el ajemplo
    por fa si sabes algo de tda tipo de datos abstractos mandame material
    ami correo estoy creando tda de matrices y arreglos
    mi correo es trejo_bronce@hotmail.com

Deja un comentario

Redes Sociales

Follow @JuanKRuiz
Answer Questions

Busca en el blog

Artículos Relacionados

  • El extraño caso de la ventana sin borde que no se deja maximizar ni minimizar
  • C# – Cómo modificar la transparencia en la ventana de otro proceso?
  • C# – Recibir notificaciones cuando hayan cambios de sesión parte 2 – Windows Forms
  • Como abrir la puerta del cd rom desde C# y VB.NET
  • C# – Recibir notificaciones cuando hayan cambios de sesión parte 1
  • C# – usar el WndProc en una Ventana WPF
  • C# – Recibir notificaciones cuando hayan cambios de sesión parte 3 – WPF
  • Artículos Relacionados

  • El extraño caso de la ventana sin borde que no se deja maximizar ni minimizar
  • C# – Cómo modificar la transparencia en la ventana de otro proceso?
  • C# – Recibir notificaciones cuando hayan cambios de sesión parte 2 – Windows Forms
  • Como abrir la puerta del cd rom desde C# y VB.NET
  • C# – Recibir notificaciones cuando hayan cambios de sesión parte 1
  • C# – usar el WndProc en una Ventana WPF
  • C# – Recibir notificaciones cuando hayan cambios de sesión parte 3 – WPF
  • Nube de Temas

    API - Azure - C# - codigo - Forms - IE - IE9 - Image - imagenes - IT - Microsoft - MVP - Pinned - PowerShell - Proceso - rendimiento - RSS - sistema - Sistemas Operativos - Site - Visual - WCF - Windows - Windows 8 - Windows Store - WinRT - WndProc - WPF - XAML - XNA

    Blogs recomendados

  • VBCodigoPocketPC Espacio para tratar temas de programacion para dispositivos moviles, Pocket PC, Compact Framework, Embbeded Visual Basic, Visual Basic.NET , C# (C Sharp)
  • Róbinson Moscoso Estaré publicando acá cosas sobre tecnologia .NET, situacioines cotidianas de las que voy aprendiendo… sirve como extensión de memoria.
  • .Net C# Blog de Nelsón Venegas
  • Warnov Microsoft Developer Evangelist
  • IT LIfe Blog de mi Hermano que esta en el lado claro: IT
  • Sorey Garcia Una chica del común con la firme intención de no serlo
  • Black Byte videojuegos, modelado y animación 3d
  • Road to IT World Cosas interesantes de IT
  • Marcela Chitiva Un poco de esto… un poco de aquello
  • Surviving the Nigth El mejor blog para aquellos que nos gustan los “internals”
  • Meta

    1. Log in
    2. WordPress

    Ideas de un Conejo is powered by Wordpress. Theme designed by Juan Carlos Ruiz.