[ACTUALIZACION 02-09-2014]: se modifico el post y se uso el sourcecode para deplegar mejor el codigo.
Volviendo a los codigos y tutoriales, dejo este ejemplo de VB .NET para deshabilitar la X del formulario.
Y ademas, de yapa, el codigo para bloquear el cierre de la aplicacion con la combinacion de teclas ALT+F4
El formulario tendra 2 botones: uno para deshabilitar la X y otro para cerrar la aplicacion.
A continuacion el codigo.
Primero agregamos un Modulo al proyecto que tendra el sgte codigo:
Module Module1 Private Declare Function RemoveMenu Lib "user32" _(ByVal hMenu As IntPtr, ByVal nPosition As Integer, ByVal wFlags As Long) As IntPtr Private Declare Function GetSystemMenu Lib "user32" _(ByVal hWnd As IntPtr, ByVal bRevert As Boolean) As IntPtr Private Declare Function GetMenuItemCount Lib "user32" _(ByVal hMenu As IntPtr) As Integer Private Declare Function DrawMenuBar Lib "user32" _(ByVal hwnd As IntPtr) As Boolean Private Const MF_BYPOSITION = &H400 Private Const MF_REMOVE = &H1000 Private Const MF_DISABLED = &H2 Public Sub DisableCloseButton(ByVal hwnd As IntPtr) Dim hMenu As IntPtr Dim menuItemCount As Integer hMenu = GetSystemMenu(hwnd,False) menuItemCount = GetMenuItemCount(hMenu) Call RemoveMenu(hMenu, menuItemCount – 1, MF_DISABLED Or MF_BYPOSITION) Call RemoveMenu(hMenu, menuItemCount – 2, MF_DISABLED Or MF_BYPOSITION) Call DrawMenuBar(hwnd) End Sub End Module
En el formulario, agregamos el sgte codigo en el boton Disabled X
Private Sub btnDeshabilitar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDeshabilitar.Click DisableCloseButton(Me.Handle) End Sub
Y este codigo impide el cierre de con las teclas ALT+F4
Private Sub Form1_Unload(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing 'impide la combinacion ALT+F4 para cerrar la aplicacion y cerrar el formulario con la X e.Cancel = True End Sub
Finalmente este seria el codigo del formulario completo:
Public Class Form1 Private Sub btnDeshabilitar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDeshabilitar.Click DisableCloseButton(Me.Handle) End Sub Private Sub btnSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalir.Click Application.Exit() End Sub Private Sub Form1_Unload(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing 'impide la combinacion ALT+F4 para cerrar la aplicacion y cerrar el formulario con la X e.Cancel = True End Sub End Class
Este codigo fue probado con Visual Studio 2008.
TYDW.-
hola,
he tratado de utilizar este codigo pero el numero de argumentos en las funciones es erroneo
Call RemoveMenu(hMenu, menuItemCount – 1, MF_DISABLED Or MF_BYPOSITION)
Call RemoveMenu(hMenu, menuItemCount – 2, MF_DISABLED Or MF_BYPOSITION)
y… esta propiedad (hwnd) cómo la declaro?
Gracias por su post
En Propiedades del form hay algo que dice: «controlbox=true» cambienlo a «false»
y no aparecerá mas el bendito boton x
Be Rock… escribe bien pues… funciona bien.
Miguel…. se borran todos los comandos no es lo correcto.
gracias por el aporte, lo unico que yo necesitaba erta deshabilitar la x y utile su codigo asi:
1) primero cree el modulo
Module Module1
Private Declare Function RemoveMenu Lib «user32» (ByVal hMenu As IntPtr, ByVal nPosition As Integer, ByVal wFlags As Long) As IntPtr
Private Declare Function GetSystemMenu Lib «user32» (ByVal hWnd As IntPtr, ByVal bRevert As Boolean) As IntPtr
Private Declare Function GetMenuItemCount Lib «user32» (ByVal hMenu As IntPtr) As Integer
Private Declare Function DrawMenuBar Lib «ser32» (ByVal hwnd As IntPtr) As Boolean
Private Const MF_BYPOSITION = &H400
Private Const MF_REMOVE = &H1000
Private Const MF_DISABLED = &H2
Public Sub DisableCloseButton(ByVal hwnd As IntPtr)
Dim hMenu As IntPtr
Dim menuItemCount As Integer
hMenu = GetSystemMenu(hwnd, False)
menuItemCount = GetMenuItemCount(hMenu)
Call RemoveMenu(hMenu, menuItemCount – 1, MF_DISABLED Or MF_BYPOSITION)
Call RemoveMenu(hMenu, menuItemCount – 2, MF_DISABLED Or MF_BYPOSITION)
End Sub
End Module
2)y la funcion la llame en el evento load del formulario
Private Sub form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
DisableCloseButton(Me.Handle)
End Sub
Asi me funciona perfectamente
Hago exactamente como lo explican pero me aparece error en :
Call RemoveMenu(hMenu, menuItemCount – 1, MF_DISABLED Or MF_BYPOSITION)
Call RemoveMenu(hMenu, menuItemCount – 2, MF_DISABLED Or MF_BYPOSITION)
estos son los errores:
Error 1 Demasiados argumentos para ‘Declare Ansi Function RemoveMenu Lib «user32″ (ByVal hMenu As IntPtr, ByVal nPosition As Integer, ByVal wFlags As Long) As IntPtr»() As Object’. C:\Documents and Settings\Nestor Duarte\Mis documentos\Visual Studio 2008\Projects\WindowsApplication1\WindowsApplication1\Module1.vb 28 25 WindowsApplication1
Error 2 El carácter no es válido. C:\Documents and Settings\Nestor Duarte\Mis documentos\Visual Studio 2008\Projects\WindowsApplication1\WindowsApplication1\Module1.vb 30 46 WindowsApplication1
por favor necesito q
hice todo los pasos tal cual como lo explican ustedes y aparecen errores.
Error 1 Demasiados argumentos para ‘Declare Ansi Function RemoveMenu Lib «user32″ (ByVal hMenu As IntPtr, ByVal nPosition As Integer, ByVal wFlags As Long) As IntPtr»() As Object’. C:\Documents and Settings\Nestor Duarte\Mis documentos\Visual Studio 2008\Projects\WindowsApplication1\WindowsApplication1\Module1.vb 28 25 WindowsApplication1
Error 2 El carácter no es válido. C:\Documents and Settings\Nestor Duarte\Mis documentos\Visual Studio 2008\Projects\WindowsApplication1\WindowsApplication1\Module1.vb 28 46 WindowsApplication1
el error 2 es un caracter ( – 1, -2 ) q salen en el lo los siguiente:
Call RemoveMenu(hMenu, menuItemCount – 1, MF_DISABLED Or MF_BYPOSITION)
Call RemoveMenu(hMenu, menuItemCount – 2, MF_DISABLED Or MF_BYPOSITION)
Call DrawMenuBar(hwnd)
por favor necesito q me ayuden urgente!!!
se los agradeceria!!
Creo que hay que revisar antes la version del Visual Studio, ya que este ejemplo creo que lo realice con VS 2008.
Atento a sus comentarios.
yo tengo Vs 2008 Y NO FUNCIONA
sera q me puedes enviar los archivos donde hicistes el ejemplo… me seria muy util.. por favor te lo agradeceria
mi correo es este ivandelahoz10@hotmail.com
por favor ayudame es urgente..
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
e.Cancel = True
End Sub
otra opcion, en lugar de deshabilitar el boton, simplemente se cancela el cerrado del formulario.
el código funciona perfecto, el problema es que estan copiando y pegando, yo borre el signo menos y lo escribi, y solucione el problema
EL PROBLEMA ES QUE TIENE QUE QUITAR LAS COMILLAS EN LA DECLARACIONES A LA LIBRERIAS PARA QUE EL VB LO GENERE COMO DEBE DE SER, RESUMEN LA PROGRAMACION DEBE DE QUEDAR CON LOS COLORES QUE MUESTRA EL EJEMPLO
GEORGE.. tienes toda la razon
trabaja perfectamente