C# – Cómo modificar el comportamiento del botón minimizar, maximizar, etc.
September 13th, 2009 by JuanK
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 intWM_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/
- 9 Comentarios »
- Publicado en la categoría 'C#'

Wordpress
9 comentarios to “C# – Cómo modificar el comportamiento del botón minimizar, maximizar, etc. ”
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/ [...]
September 13th, 2009 at 1:01 pm
[...] http://juank.black-byte.com/c-modificar-boton-minimizar-maximizar/ [...]
September 13th, 2009 at 1:10 pm
[...] http://juank.black-byte.com/c-modificar-boton-minimizar-maximizar/ [...]
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.
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
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
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/
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!!
April 4th, 2011 at 3:12 pm
y para por ejemplos SC_RESTORE cual seria el valor?