Tema: Boton cerrar en ventana de winforms
Pregunta: Como puedo deshabilitar el boton cerrar de las ventanas de windows en los winforms? ( [x] )
Respuesta:
En algunos casos, podemos necesitar que el usuario no cierre nuestro formulario sino es mas que utilizando un boton personalizado. Por ejemplo que nuestro programa ejecute un proceso, que deba ser detenido, antes de que se cierre el formulario, entonces en un boton detendremos nuestro proceso y luego cerraremos el formulario por ejempo con me.close(); pero esto no ocurriría si le dejamos la opcion de que lo cierre con el boton que windows pone en nuestros formularios, el famoso [x], o bien que cuando este minimizado el form, con el boton derecho del mouse y luego la opcion cerrar... o presionando alt+f4 etc por que esta comprobado que los usuarios son propensos a utilizar estos metodos, por estar mas familiarizados con ellos que con presionar nuestro boton. Para estos casos, necesitamos una funcion que deshabilite todas las opciones de cierre del formulario y que nos deje especificar en nuestro propio boton como será el proceso de cierre.
ejemplo
Aqui esta el codigo fuente.
Código PHP:
//en primera instancia, antes de cualquier declaracion, debemos incluir las librerías necesarias.
Imports System
Imports System.Drawing
Imports System.Collections
Imports System.ComponentModel
Imports System.Windows.Forms
Imports System.Data
Imports System.Runtime.InteropServices
// luego debajo de la declaracion de la clase form vendra el codigo.
Public Class Form1
Inherits System.Windows.Forms.Form
Private Const MF_BYPOSITION As Integer = &H400
Private Const MF_REMOVE As Integer = &H1000
Private Const MF_DISABLED As Integer = &H2
//Variable para saber si ya está desactivado el botón X
Private pulsado As Boolean = True
//Importación de procedimientos externos almacenados
//en la librería de Windows USER32.DLL
//Obtener el menú de sistema
Private Declare Function GetSystemMenu Lib "User32" _
(ByVal hWnd As Integer, _
ByVal bRevert As Boolean) As IntPtr
//Obtener el número de elementos del menú de sistema
Private Declare Function GetMenuItemCount Lib "User32" _
(ByVal hMenu As Integer) As IntPtr
//Quitar elementos del menú de sistema
Private Declare Function RemoveMenu Lib "User32" _
(ByVal hMenu As Integer, _
ByVal nPosition As Integer, _
ByVal wFlags As Long) As IntPtr
//Redibujar la barra de título de la ventana
Private Declare Function DrawMenuBar Lib "User32" _
(ByVal hWnd As Integer) As IntPtr
//Método que desactiva el botón X (cerrar)
Private Sub DisableCloseButton(ByVal hWnd As IntPtr)
Try //captura de excepciones
Dim menuItemCount As IntPtr
Dim hMenu As IntPtr
//Obtener el manejador del menú de sistema del formulario
hMenu = GetSystemMenu(hWnd.ToInt32(), False)
//Obtener la cuenta de los ítems del menú de sistema.
//Es el menú que aparece al pulsar sobre el icono a la izquierda
//de la Barra de título de la ventana, consta de los ítems: Restaurar, Mover,
//Tamaño,Minimizar, Maximizar, Separador, Cerrar.
menuItemCount = GetMenuItemCount(hMenu.ToInt32())
//Quitar el ítem Close (Cerrar), que es el último de ese menú
RemoveMenu(hMenu.ToInt32(), menuItemCount.ToInt32() - 1, MF_DISABLED Or MF_BYPOSITION)
//Quitar el ítem Separador, el penúltimo de ese menú, entre Maximizar y Cerrar
RemoveMenu(hMenu.ToInt32(), menuItemCount.ToInt32() - 2, MF_DISABLED Or MF_BYPOSITION)
//Redibujar la barra de menú
DrawMenuBar(hWnd.ToInt32())
//mostrar un mensaje con la excepción producida
Catch pollo As Exception
MessageBox.Show("Se ha producido la excepción: " + vbCrLf + pollo.Message, _
"Error del programa", MessageBoxButtons.OK)
End Try
End Sub
// Luego en el evento load del formulario deshabilitaremos nuestro boton `[x]
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
DisableCloseButton(Me.Handle)
End Sub
End Class
Y esto es finalmente todo... espero que le sirva a alguien, y que sea utilizado para el bien y no para crear "esas" aplicaciones que sirven para hacer daños.
Suerteee !!!!!